logstash конвертировать время в дату

Я использую logstash для передачи данных из filebeat в elasticsearch. Мои данные имеют время как hh:mm:ss a (05:21:34). Я хочу добавить к нему сегодняшнюю дату. Это фильтр конфигурации logstash

filter{
    grok{ some grok pattern to get time}
    date {
        locale => "en"
        match => ["time", "hh:mm:ss a"]
        target => "@timestamp"
    }
}

Но данные преобразованы как 2016-01-01T05:21:34.000Z Как я могу изменить его на 2016-10-14T05:21:34.000Z?


person warrior107    schedule 14.10.2016    source источник


Ответы (1)


Я думаю, что logstash достаточно умен, чтобы использовать текущий год (как вы видите), но он не использует другие поля по умолчанию.

Вы должны создать новое поле с полной строкой даты и времени, которую вы хотите. Что-то вроде этого должно работать между вашим гроком и датой:

grok { }
mutate {
    add_field => { "datetime" => "%{+YYYY.MM.dd} %{time}" }
}
date { }

Обязательно измените шаблон даты{}, чтобы использовать новое поле даты и времени и его формат. Если вы не хотите, чтобы поле datetime после вызова date{}, вы можете использовать вместо него поле метаданных или remove_field как часть date{}.

person Alain Collins    schedule 16.10.2016
comment
add_field => { "datetime" => "%{+YYYY.MM.dd} %{time}" } в чем разница между добавлением этого оператора в grok и mutate? - person warrior107; 17.10.2016
comment
add_field (и remove_field) работают, когда базовый фильтр работает успешно. В вашем случае вы можете добавить его в grok{}, и это создаст новое поле [datetime] только в том случае, если grok сработает. Однако мутация использует поле [время], которое только что было создано в том самом гроке, и это заставляет меня нервничать (раньше я был укушен таймингом переменных, создаваемых различными фильтрами). Это также более явно в отдельном блоке. - person Alain Collins; 17.10.2016