我尝试在Grok自定义模式中使用lookbehind和lookahead,但在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"
}
相反,从调试器中,我收到“Provided Grok模式与输入中的数据不匹配”。
如何正确地使此lookbehind/lookahead工作?
编辑:我应该注意到,如果Grok模式末尾没有postgrey_action匹配,Grok调试器将按预期运行和工作(使用linux-syslog和grok-patterns)。
日志存储版本6.3.2
1条答案
按热度按时间6ioyuze21#
作为一种变通方法,我采用了修改语法的方法,使用一个定制的模式文件,并在每个过滤器中使用patterns_dir指令引用它。
例如我的模式:
我的过滤器:
但是,此解决方法仍然没有回答我最初的问题,即为什么我最初的方法不起作用?
查看Oniguruma Regex documentation和Grok过滤器文档,我不清楚我的原始语法有什么问题,也不清楚如何使用grok regex named capture正确实现look-ahead/look-behind。如果不支持,就不应该这样记录。