Поле фильтрации с массивом в виде 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]"
}
}