class SemanticLogger::Appender::AsyncBatch

def process_messages

Separate thread for batching up log messages before writing.
def process_messages
  loop do
    # Wait for batch interval or number of messages to be exceeded.
    signal.wait(batch_seconds)
    logs          = []
    messages      = []
    first         = true
    message_count = queue.length
    message_count.times do
      # Queue#pop(true) raises an exception when there are no more messages, which is considered expensive.
      message = queue.pop
      if message.is_a?(Log)
        logs << message
        if first
          check_lag(message)
          first = false
        end
      else
        messages << message
      end
    end
    appender.batch(logs) if logs.size.positive?
    messages.each { |message| process_message(message) }
    signal.reset unless queue.size >= batch_size
  end
end