Поле фильтрации с массивом в виде JSON в logstash

Я начинаю собирать журналы с logstash, Текущая настройка состоит из сервера Java, использующего logback в качестве механизма регистрации и logstash-logback-encoder, вывод данных в аккуратном JSON-представлении. Основы работают просто отлично.

Я хотел бы разделить дополнительные данные в формате JSON в отдельных полях (поэтому каждый ключ JSON заканчивается в своем собственном поле). logstash-logback-encoder обеспечивает механизм для вывода таких данных в json_mesage поле. Однако эта строка JSON помещается в массив JSON. Смотрите здесь образец, отформатированный для лучшего чтения.

{
"@timestamp":"2014-03-25T19:34:11.586+01:00",
"@version":1,
"message":"Message{\"activeSessions\":0}",
"logger_name":"metric.SessionMetrics",
"thread_name":"scheduler-2",
"level":"INFO",
"level_value":20000,
"HOSTNAME":"stage-01",
"json_message":["{\"activeSessions\":0}"],
"tags":[]
}

Я попытался проанализировать входящий JSON, используя простой фильтр JSON. Смотрите здесь мою конфигурацию:

input {
  lumberjack {
    <snipped>
    codec => "json"
  }
}
filter {
  json {
    source => "json_message"
  }
 }
 output {
   elasticsearch {
     <snipped>
   }
 }

Однако это приводит к следующей ошибке в журнале logstash. Строка JSON в массиве просто не может быть обработана.

{:timestamp=>"2014-03-25T19:43:13.232000+0100", 
 :message=>"Trouble parsing json", 
 :source=>"json_message", 
 :raw=>["{\"activeSessions\":0}"], 
 :exception=>#<TypeError: can't convert Array into String>, 
 :level=>:warn}

Есть ли способ извлечь строку JSON из массива перед анализом? Любая помощь с благодарностью. Благодарю.

1 ответ

Решение

На самом деле, это довольно просто и играет в русле общих языков программирования. Хотя я не нашел ответа в документации.

Просто добавьте индекс к полю в фильтре:

filter {
  json {
    source => "json_message[0]"
  }
}
Другие вопросы по тегам