1

我正在尝试在 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 模式与输入中的数据不匹配”。

我怎样才能正确地使这种后向/前瞻工作?

编辑:我应该注意,在 Grok 模式末尾没有 postgrey_action 匹配,Grok 调试器会按预期运行和工作(使用 linux-syslog 和 grok-patterns)。

Logstash 版本 6.3.2

4

1 回答 1

1

作为一种变通方法,我已经求助于修改我的语法,使用自定义模式文件,并使用 patterns_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 正则表达式文档Grok 过滤器文档,我不清楚我的原始语法有什么问题,或者如何使用名为 capture 的 grok 正则表达式正确实现前瞻/后视。如果不支持,则不应这样记录。

于 2019-04-11T15:17:12.857 回答