#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
деталь и ]
символ.