如何在自定义grok模式中引用正则表达式组?

我想在我的日志行中添加特定URI参数的字段

这是一个示例日志行:

2017-03-12 21:34:36 W3SVC1 webserver 1.1.1.1 GET /webpage.html param1=11111&param2=22222&param3=&param4=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 =”和“&”之间的文本.但是格罗克忽略了捕获组并获得了“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设置为false:

named_captures_only
– Value type is 07001
– Default value is true
If true, only store named captures from grok.

但是,使用命名捕获组没有任何问题(我使用了一个否定的字符类[^&] *而不是一个带有消耗&延迟的匹配点):

\bparam1=(?<param1>[^&]*)

[^&] *匹配除&之外的0个或更多个字符,因此也匹配空参数(您可能希望通过更改*来避免,或使用keep_empty_captures参数控制)和字符串末尾.

enter image description here

转载注明原文:如何在自定义grok模式中引用正则表达式组? - 代码日志