我想在我的日志行中添加特定 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”。我如何才能获得第二组?
最佳答案
How can I say use capture group 1 or tell grok to use my regex capture group?
默认情况下,grok 只考虑命名的捕获组,编号的捕获组不会触发字段创建。如果要覆盖此行为,请设置
named_captures_only
假的:named_captures_only
- Value type is boolean
- Default value istrue
Iftrue
, only store named captures from grok.
但是,使用命名的捕获组并没有错(我将使用否定字符类
[^&]*
而不是惰性匹配点,其后带有消耗的 &
):\bparam1=(?<param1>[^&]*)
[^&]*
匹配除 &
之外的 0 个或多个字符,因此也将匹配空参数(您可能希望通过将 *
更改为 +
来避免,或使用 keep_empty_captures
参数进行控制)和字符串的末尾。关于regex - 如何在自定义 grok 模式中引用正则表达式组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42754286/