我有两个具有不同日志结构的梭子鱼固件和一个需要解析它们的 Logstash grok 过滤器插件。
值仅记录条目
+02:00 Info blabla Detect: FWD|TCP|bond0.777|1.1.1.1|53329|00:00:00:00:00:00|20.190.159.32|443||bond1.182||0|80.231.71.252|20.190.159.32|0|1|0|0|0|0||SSL|Microsoft Services Base|graph.microsoft.com||Computing/Technology (82)
字段 + 值日志条目
+02:00 Info blabla Remove: type=FWD|proto=UDP|srcIF=pvpn0|srcIP=1.1.1.1|srcPort=61661|srcMAC=00:00:00:00:00:00|dstIP=10.248.0.10|dstPort=53|dstService=dns|dstIF=pvpn0|rule=V2L-DNS-IN|info=Balanced Session Idle Timeout|srcNAT=10.248.11.215|dstNAT=127.0.0.1|duration=20|count=1|receivedBytes=444|sentBytes=82|receivedPackets=1|sentPackets=1|user=johba|protocol=|application=|target=|content=|urlcat=
对于第一个场景,我已经有了一个正则表达式。但是,我希望有一个在这两种情况下都匹配的正则表达式,无论提交的名称是否存在。
例如,我希望我的正则表达式同时匹配FWD
和type=FWD
- 我首先尝试使用 char 类,即
[type=]*\w+
. 缺点是,例如,如果我有dstService=dns
,并且我的正则表达式的部分是[dstService=]*\w+
grok 过滤器将ns
只匹配而不是dns
- 然后我尝试了
d*s*t*S*e*r*v*i*c*e*=*\w+
,这奏效了。但是,我在想是否有更优雅的方式来实现这个目标?
字符类匹配该类中定义的范围内的 1 个字符。
例如,
[type=]*\w+
匹配 0 个或多个范围内的任何字符t
,y
,p
,e
, 或=
后跟 1 个或多个单词字符(即[a-zA-Z0_9_]
)[dstService=]*\w+
匹配 0 个或多个范围内的任何字符d
,s
,t
,S
,e
,r
,v
,i
,c
或=
后跟 1 个或多个单词字符(即[a-zA-Z0_9_]
)你想要匹配的是:
(?:type=)?FWD
type=
后跟FWD
(?:dstService=)?dns
dstService=
后跟dns
演示和解释