行尾的 Grok 模式可选字段

问题描述 投票:0回答:1

我想“理解”这两行:

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应用程序为空。

任何人都可以解释如何在数据存在的情况下填充字段,以及如何在数据不存在的情况下将它们设为可选。

regex grok
1个回答
0
投票

您正在使用

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}
$

© www.soinside.com 2019 - 2024. All rights reserved.