Разбить сообщение Logstash json в полях

Он имеет файл журнала, в котором хранится событие с меткой времени и сообщением json. Например:

timestamp { "foo": 12, "bar": 13}

Я хотел бы разложить ключи (foo и bar) в json part на поля в выводе Logstash.

Я знаю, что я могу установить поле формата в файле фильтра Logstash на json_event, но в этом случае мне нужно включить метку времени в json. Существует также json-фильтр, но он добавляет одно поле с полной структурой данных json вместо использования ключей.

Любые идеи, как это можно сделать?

Ответы

Ответ 1

Попробуйте использовать последнюю версию logstash 1.2.1 и используйте значение кодека для непосредственного анализа событий json.

input {
    file {
        type => "tweetfile"
        path => ["/home/nikhil/temp/feed/*.txt"]
        codec => "json"
    }
}
filter{
    json{
        source => "message"
        target => "tweet"
    }
}
output {
    stdout { }
    elasticsearch { embedded => true }
}

Ответ 2

Я сделал это со следующей конфигурацией:

filter {
  grok {
    match => ["message", "\[%{WORD}:%{LOGLEVEL}\] %{TIMESTAMP_ISO8601:tstamp} :: %{GREEDYDATA:msg}"]
  }
  date {
    match => [ "tstamp", "yyyy-MM-dd HH:mm:ss" ]
  }
  json {
    source => "msg"
  }
}

Кстати, это конфиг для новой версии 1.2.0.

В версии 1.1.13 вам нужно включить target в json-фильтр, а ссылка для сообщения в grok - это @message.

Ответ 3

Вы можете просто использовать простые фильтры Grok (фильтры/шаблоны стиля регулярных выражений) и назначить сопоставленное значение переменной для упрощения организации, фильтрации и поиск.

Пример:

((?<foo_identifier>(\"foo\"))):((?<foo_variable_value>(\d+,)))

Что-то в этом роде.

Используйте GrokDebugger, чтобы помочь, если вы застряли на синтаксисе, шаблонах и вещах, которые, по вашему мнению, должны быть сопоставлены, но нет.

Надеюсь, что это поможет.

Ответ 4

ваш JSON ошибочен {"foo": 12, "bar" 13}

должен быть:

{"foo": 12, "bar": 13}