Фильтр RegEx работает в RegExr, но не в Logsta sh Grok - PullRequest
1 голос
/ 13 апреля 2020

Я пытаюсь отфильтровать уровень журнала для некоторых файлов журнала, которые у меня есть. Моя проблема в том, что Grok, похоже, не может обработать \w, находящийся в начале фильтра.

Я использую этот сайт для проверки регулярного выражения: https://regexr.com/

Я использую этот сайт для тестирования фильтра Грока: http://grokdebug.herokuapp.com/

Вот мой пример строки журнала: 2020-04-07T13: 08: 19.261-0700 | INFO |||

Вот что я пытаюсь запустить:

(?<timestamp>.+?(?=\|))(?<loglevel>\w+?(?= \|))

Это говорит, что МАТЧЕЙ не найдено. Если я заменю "\ w" на "." он сразу находит строку, но оставляет не-буквенный символ:

{
  "timestamp": [
    [
      "2020-04-07T13:08:19.261-0700"
    ]
  ],
  "loglevel": [
    [
      "|INFO"
    ]
  ]
}

Это должно непременно работать. Это просто говорит совпадение \ W символов. Мне явно не хватает знания регулярных выражений здесь. Кто-нибудь знает, что происходит, и готов бросить несколько указателей на моем пути?

1 Ответ

2 голосов
/ 13 апреля 2020

Ваше регулярное выражение не соответствует строке правильно, потому что (?=\|) является непотребляющим шаблоном, а шаблон не соответствует пробелу после отметки времени с \w.

. Вы можете исправить свой текущий шаблон с помощью

(?<timestamp>.+?)\|(?<loglevel>\w+) \|
                 ^^                ^^^

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

Обратите внимание, что вы можете использовать

%{TIMESTAMP_ISO8601:timestamp}\|%{LOGLEVEL:loglevel}

для анализа вашего токовый вход.

...