我正在尝试在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
答案 0 :(得分:0)
作为一种变通方法,我已求助于使用自定义模式文件来修改语法,并使用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 Regex documentation和Grok filters documentation,我不清楚我的原始语法有什么问题,或者应该如何使用名为capture的grok正则表达式正确实现先行/后行。如果不支持,则不应将其记录为文档。