grok фильтр для logstash

В моем файле журнала есть строки вида:

10/13 14:05:18.192 [modulename]: [pid]: (debug level string): message string XYZ:<xyz value>

куда

  • modulename это строка
  • pid — целое число
  • debug level string — это строка типа «отладка», «информация» или «ошибка».
  • message string это строка
  • xyz value — целое число

пример:

10/13 14:05:18.192 [MyModule]: [12345]: (debug): This is my message. XYZ: 987

Я поискал и попробовал несколько вещей, но получаю _grokparsefailure. Может ли кто-нибудь помочь показать мне, какой фильтр я могу использовать в logstash для анализа этих журналов?


person redkite    schedule 15.10.2014    source источник
comment
Что вы пробовали? Пробовали ли вы использовать grokdebug.herokuapp.com для постепенного добавления в шаблон?   -  person Alcanzar    schedule 15.10.2014
comment
Если я передам приведенный выше пример журнала для обнаружения в grokdebugger, он предложит: %{SYSLOGPROG}{URIPATHPARAM} %{HAPROXYTIME} %{SYSLOG5424SD}: %{NAGIOSTIME}: (отладка): Это мое сообщение. XYZ: 987 , но когда я использую ссылку Debugger в grokdebugger и использую этот шаблон и ввожу свой пример, это ему не нравится. Кроме того, кажется, что grokdebugger рассматривает 10/13 как путь? и pid как NAGIOSTIME - не подходит.   -  person redkite    schedule 16.10.2014
comment
(?<date>\d\d/\d\d) %{TIME:time} \[%{WORD:module}\]: \[%{WORD:pid}\]: соответствует началу вашего журнала... посмотрите, сможете ли вы его закончить   -  person Alcanzar    schedule 16.10.2014
comment
Спасибо - это сработало. Я не могу разобрать 987 (мой пример выше) в целое число. Я пробовал: (?‹date›\d\d/\d\d) %{TIME:time} [%{WORD:module}]: [%{WORD:pid}]: (%{WORD:dbg_lvl}) : %{GREEDYDATA:msg} XYZ: %{INT:count} но я получаю ошибку синтаксического анализа. Если я удалю XYZ: %{INT:count}, это сработает, но тогда я потеряю счет. Кроме того, я хотел бы объединить дату и время, чтобы я мог сортировать их по дате + времени. Есть ли способ сделать это?   -  person redkite    schedule 16.10.2014


Ответы (1)


Прежде всего {GREEDYDATA} означает до конца события регистрации. Таким образом, весь текст, который находится после dbg_lvl, будет назначен {GREEDYDATA}.

Вот, попробуйте следующий код. Проблема с вашим фильтром кода заключалась в том, что он не смог ничего проанализировать после msg. Надеюсь это поможет.

(?<date>\d\d/\d\d) %{TIME:time} \[%{WORD:module}\]: \[%{WORD:pid}\]: \(%{WORD:log_level}\): %{CISCO_REASON}. %{WORD}: %{BASE10NUM:xyz_number}

person user3195649    schedule 15.10.2014
comment
Это работает по большей части. Но я заметил, что всякий раз, когда строка сообщения содержит такие символы, как [] или ! или ... или aaa.bbb.ccc, синтаксический анализ не пройден. Где я могу найти определение CISCO_REASON и другие встроенные парсеры, которые я могу использовать? По сути, я хочу иметь возможность анализировать журналы с любой строкой между log_lvl: и XYZ: . - person redkite; 16.10.2014