Синтаксис Lookahead и Lookbehind в пользовательском шаблоне Grok - PullRequest
0 голосов
/ 10 апреля 2019

Я пытаюсь использовать lookbehind и lookahead в пользовательском шаблоне Grok и получаю ошибки совпадения с шаблоном в отладчике Grok, которые не могу устранить.

Это для архивирования системных журналов.В настоящее время я пытаюсь разобрать приложение postgrey.

Приведенные данные, такие как:

2019-04-09T11:41:31-05:00 67.157.192.7 postgrey: action=pass, reason=triplet found, delay=388, client_name=unknown, client_address=103.255.78.9, sender=members@domain.com, recipient=person@domain.com

Я пытаюсь использовать следующее, чтобы натянуть строку между «action =» и запятой, следующей сразу за ней в качестве поля «postgrey_action»:

%{TIMESTAMP_ISO8601:timestamp} (?:%{SYSLOGFACILITY} )?%{SYSLOGHOST:logsource} %{SYSLOGPROG} (?<postgrey_action>(?<=action=).+?(?=\,))

Я ожидаю увидеть следующий вывод:

{
  "program": "dhcpd:",
  "logsource": "66.146.192.67",
  "timestamp": "2019-04-09T11:41:31-05:00"
  "postgrey_action": "pass"
}

Вместо этого от отладчика я получаю «При условии, что шаблоны Grok не соответствуют данным на входе».

Как правильно заставить работать этот lookbehind / lookahead?

Редактировать: я должен отметить, что без совпадения postgrey_action в конце шаблона Grok, отладчик Grok работает и работает как положено (используя linux-syslog и grok-pattern).

Logstash версии 6.3.2

1 Ответ

0 голосов
/ 11 апреля 2019

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

Пример. Мой шаблон:

POSTGREY %{TIMESTAMP_ISO8601:timestamp} (?:%{SYSLOGFACILITY} )?%{SYSLOGHOST:logsource} %{SYSLOGPROG} (action=)%{WORD:postgrey_action}(,) (reason=)%{DATA:postgrey_reason}(,) (delay=)%{NUMBER:postgrey_delay}(,) (client_name=)%{IPORHOST}(,) (client_address=)%{IPORHOST:postgrey_clientaddr}(,) (sender=)%{EMAILADDRESS:postgrey_sender}(,)

Мой фильтр:

    if "postgrey" in [program]  {
        grok {
        match => { "message" => "%{POSTGREY}"}
        patterns_dir => ["/etc/logstash/patterns"]
        overwrite => [ "message" ]
        }
    }

Однако этот обходной путь все еще не отвечает моемуОригинальный вопрос: почему мой первоначальный подход не сработал?

Если посмотреть документацию Oniguruma Regex и документацию Фильтры Grok , это не яснодля меня, что не так с моим оригинальным синтаксисом или как должным образом реализовывать упреждающий просмотр / упускание с помощью grok regex с именем capture.Если это не поддерживается, это не должно быть задокументировано как таковое.

...