Logstash Grok - Как разобрать поле @timestamp с использованием шаблона HTTPDERROR_DATE?

В моем файле журнала есть такой шаблон:

[Sun Oct 30 17:16:09 2016] [TRACE_HIGH] [TEST1] MessageTest1
[Sun Oct 30 17:16:10 2016] [TRACE_HIGH] [TEST2] MessageTest2

Шаблон:

\A\[%{HTTPDERROR_DATE}](?<message>(.|\r|\n)*)

Фильтр:

filter {
  if [type] == "mycustomlog" {
    grok {
      match => { "message" => "\A\[%{HTTPDERROR_DATE}](?<message>(.|\r|\n)*)"}
    }
    date {
      # Format: Wed Jan 13 11:50:44.327650 2016 (GROK: HTTPDERROR_DATE)
      match => [ "timestamp", "EEE MMM dd HH:mm:ss yyyy"]     
    }
    multiline {
      pattern => "^%{SYSLOG5424SD}%{SPACE}"
      what => "previous"
      negate=> true
    }
  }
} 

Я пытаюсь использовать свой журнал даты и времени в поле @timestamp, но не могу проанализировать этот формат в @timestamp. Почему фильтр даты не заменил значение @timestamp?

Моя отметка @timestamp отличается от строки журнала:

строка [0]

  • @timestamp: [среда, 2 ноября, 15:56: 42 2016 г.]
  • сообщение: [среда, 2 ноября, 15:56: 41 2016]

введите здесь описание изображения

Я следую этому руководству:

https://www.digitalocean.com/community/tutorials/adding-logstash-filters-to-improve-centralized-logging

С использованием:

Elasticsearch 2.2.x, Logstash 2.2.x и Kibana 4.4.x

Печать конструктора Grok:  введите описание изображения здесь


person Vitorlui    schedule 02.11.2016    source источник
comment
Не могли бы вы показать полное содержание логов (от Kibana или ES)? Потому что, похоже, проблема не в парсинге даты, а в фильтре grok. При тестировании grokconstructor.appspot.com/do/match#result он не Работа. (и поэтому поле отметки времени не существует, а фильтр даты имеет поле для работы).   -  person baudsp    schedule 03.11.2016
comment
Я не эксперт по регулярным выражениям, но я думаю, что проблема связана со второй частью, пытаясь сопоставить \ r и \ n   -  person baudsp    schedule 03.11.2016
comment
Я попробую использовать только метку времени и вернусь с дополнительной информацией   -  person Vitorlui    schedule 03.11.2016
comment
@baudsp извините, я поставил на выкройку другую версию, попробуйте с этой, пожалуйста ..   -  person Vitorlui    schedule 03.11.2016
comment
Тот, который вы указали (\A\[%{HTTPDERROR_DATE}](?<message>(.|\r|\n)*)), не создает поле из %{HTTPDERROR_DATE}. Вам необходимо иметь %{HTTPDERROR_DATE:timestamp}   -  person baudsp    schedule 03.11.2016


Ответы (3)


Используемый шаблон grok, \A\[%{HTTPDERROR_DATE}](?<message>(.|\r|\n)*) не создает поле из% {HTTPDERROR_DATE}.
У вас должен быть% {pattern: field}, чтобы данные, захваченные шаблоном, создавали поле (cf документация).

Итак, в вашем случае это будет так:

\A\[%{HTTPDERROR_DATE:timestamp}](?<message>(.|\r|\n)*)
person baudsp    schedule 03.11.2016

Я думаю, что Elasticsearch / Kibana @timestamp не поддерживает формат «EEE MMM dd HH: mm: ss yyyy». Следовательно, вы можете привести метку времени в формат "дд / МММ / гггг: ЧЧ: мм: сс.ССССС" с помощью процессора mutate.

Фрагмент, как показано ниже:

grok {
                match => [ "message", "\[%{DAY:day} %{MONTH:month} %{MONTHDAY:monthday} %{TIME:time} %{YEAR:year}\] %{GREEDYDATA:message}" ]
    }
   mutate {
                add_field => {
                                "timestamp" => "%{monthday}/%{month}/%{year}:%{time}"
        }
    }
   date {
                locale => "en"
                timezone => "UTC"
                match => ["timestamp", "dd/MMM/yyyy:HH:mm:ss.SSSSSS"]
                target => "@timestamp"
                remove_field => ["timestamp", "monthday", "year", "month", "day", "time"]
    }

Это может кому-то помочь. Спасибо!

person Nagarjuna D N    schedule 23.02.2017

Чтобы применить новое поле, вы должны ввести цель для перезаписи поля:

target => "@timestamp"

По примеру:

 date {
      match => [ "timestamp", "dd MMM yyyy HH:mm:ss" ]
      target => "@timestamp"
      locale => "en"
      remove_field => [ "timestamp" ]
    }
person Vitorlui    schedule 28.02.2017