我想“理解”这两行:
usg210 CEF:0|ZyXEL|USG210|4.65(AAPI.1)|0|Access Control|5|devID=bccf4fxxxxxx src=192.168.1.228 dst=255.255.255.255 spt=7303 dpt=7303 msg=Match default rule, DROP proto=17 app=others
usg210 CEF:0|ZyXEL|USG210||0|Blocked Web Sites|9|devID=bccf4fxxxxxx src=192.168.1.228 dst=23.57.22.128 spt=50938 dpt=443 msg=gameplay.intel.com : Games, Rule_id=5, SSI=N (HTTPS Domain Filter)
图案:
\|(?:.*)\|%{DATA:class}\|%{WORD:loglevel}\|devID=%{WORD:mac} src=%{IPV4:ipsrc} dst=%{IPV4:ipdst} spt=%{WORD:spt} dpt=%{WORD:dpt} msg=%{GREEDYDATA:msg}( proto=%{WORD:proto} app=%{WORD:app})?
字段“proto”和“app”是可选的,但我的调试器消息如下所示:“匹配默认规则,DROP proto = 17 app = others”并且proto应用程序为空。
任何人都可以解释如何在数据存在的情况下填充字段,以及如何在数据不存在的情况下将它们设为可选。
您正在使用
GREEDYDATA
模式,并且不要求您的模式匹配整个字符串。
在 Grok 中,您需要将
GREEDYDATA
替换为 DATA
并在模式末尾添加 $
:
\|.*\|%{DATA:class}\|%{WORD:loglevel}\|devID=%{WORD:mac} src=%{IPV4:ipsrc} dst=%{IPV4:ipdst} spt=%{WORD:spt} dpt=%{WORD:dpt} msg=%{DATA:msg}( proto=%{WORD:proto} app=%{WORD:app})?$
参见
msg=%{DATA:msg}( proto=%{WORD:proto} app=%{WORD:app})?$
部分,带有 msg=%{DATA:msg}
和 $
。