我有两个具有不同日志结构的 barracuda FW 和一个需要解析它们的 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
一个字符类匹配该类定义范围内的 1 个字符。
例如,
[type=]*\w+
t
匹配、y
、p
、范围内的 0 个或多个任意字符e
,或=
后跟 1 个或多个单词字符(即[a-zA-Z0_9_]
)[dstService=]*\w+
d
匹配、s
、t
、S
、e
、r
、v
、范围内的 0 个或多个任意字符i
,c
或=
后跟 1 个或多个单词字符(即[a-zA-Z0_9_]
)
您想要匹配的是:
- 第一
(?:type=)?FWD
- 匹配可选的,
type=
然后是FWD
- 匹配可选的,
- 第二
(?:dstService=)?dns
- 匹配可选的,
dstService=
然后是dns
- 匹配可选的,