我想在我的日志行中添加特定URI参数的字段
这是一个示例日志行:
2017-03-12 21:34:36 W3SVC1 webserver 1.1.1.1 GET /webpage.html param1=11111¶m2=22222¶m3=¶m4=4444444 80 - 2.2.2.2 HTTP/1.1 Java/1.8.0_121 - - balh.com 200 0 0 311 244 247 - -
我想为param1,param2,param3和param4添加字段。
我正在使用这个grok过滤器:
grok {
match => [ "message", "(?<param1>param1=(.*?)&)"]
}
所以这个正则表达式使用捕获组来获取“param1 =”和“&”之间的文本。但是grok忽略了捕获组并且得到了“param1 = 11111&”我只想捕获“111111”
我怎么能说使用捕获组1或告诉grok使用我的正则表达式捕获组?
编辑这几乎有效:
grok {
match => [ "message", "(?<param1>param1=(?<param1>.*?)&)"]
}
所以我想我在这里做的是使用两个命名组,但名称相同。问题是“param1”字段中有两个条目用于每个组。一个用于“param1 = 11111&”,一个用于“11111”。我如何才能获得第二组?
我怎么能说使用捕获组1或告诉grok使用我的正则表达式捕获组?
默认情况下,grok仅考虑命名的捕获组,编号的捕获组不会触发字段创建。如果要覆盖此行为,请将named_captures_only
设置为false:
named_captures_only - 值类型是boolean - 默认值为
true
如果true
,只存储来自grok的命名捕获。
但是,使用一个命名的捕获组没有任何问题(我使用一个否定的字符类[^&]*
而不是一个懒的匹配点,后面有一个消耗的&
):
\bparam1=(?<param1>[^&]*)
[^&]*
匹配除&
之外的0个或更多字符,因此也将匹配空参数(您可能希望通过将*
更改为+
或使用keep_empty_captures
参数控制来避免)和字符串末尾。
这有效:
grok {
match => [ "message", "(?:param1=(?<param1>.*?)&)"]
}
所以我想我在这里做的是使用一个非捕获组,其中嵌入了一个命名的捕获组。因此,父组的匹配将被丢弃,并且嵌套的命名匹配是唯一返回的内容。
这是做我认为它做的事情还是这个错误,它的愚蠢运气是否符合我的要求?