Группы захвата регулярных выражений GROK не совпадают

#regex #logstash #grok

Вопрос:

Я пытаюсь научиться захватывать различные поля в файле журнала, впервые используя фильтр grok logstash, и у меня возникают проблемы с его правильным анализом. Я использую https://grokdebug.herokuapp.com/ чтобы проверить мою работу. Это пример файла журнала:

 06/05/2021 15:08:48.591 - [aa.bbbbbbbbbbbbbbb.cccccccccc.ddddddd.EEEeeeEeeeeEeeeeee.ffffFffffFff] - [INFO] - some more text here (0:1): {"data":{"source":"ttyUSB0","timeTotal":"20","timeLeft":"10"},"somethingid":"main","secret":"aqdsaqlaxgaaaaaa444aa32aa1aa3aaa1aaaaaaawghhjuyeqbbjjga7a64aaa","type":"TEST","message":"SOMEMESSAGE","testid":"foo.bar1.1620313718583","timestamp":1620313728590}
 

Выражение grok, которое я использую (и не возвращает результата), является

 %{DATESTAMP:timestamp} - (?<test_data>(?<=[)([a-zA-Z.[]])*) - (?<rest>(?<=[)([(w*)]))
 

Когда я удаляю выражение (?<=[) lookbehind из (?<test_data>(?<=[)([a-zA-Z.[]])*) и (?<rest>(?<=[)([(w*)])) получаю следующий результат:

  • test_data: [aa.bbbbbbbbbbbbbbb.cccccccccc.ddddddd.EEEeeeEeeeeEeeeeee.ffffFffffFff]
  • rest: [INFO]

Результат, который я надеюсь получить, таков:

  • test_data: aa.bbbbbbbbbbbbbbb.cccccccccc.ddddddd.EEEeeeEeeeeEeeeeee.ffffFffffFff
  • rest: INFO

Был бы признателен за помощь / объяснение того, что я делаю неправильно

Ответ №1:

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

Поисковые системы не используют шаблоны, они просто проверяют контекст в каком-то месте. Итак, (?<=[) это шаблон, который никогда не будет совпадать, так как пробел не может быть [ символом одновременно. Вот почему шаблон, который у вас есть, не работает.

Вы можете использовать

 %{DATESTAMP:timestamp} - [%{DATA:test_data}] - [%{DATA:rest}]
 

Теперь механизм регулярных выражений найдет timestamp шаблон, затем он будет использовать пробел - , затем [ символ, затем test_data ] - [ , rest деталь и ] символ.