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

时间:2017-03-12 23:08:21

标签: regex logstash elastic-stack logstash-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=(.*?)&)"]
  }

因此,此正则表达式使用捕获组在&#34; param1 =&#34;之间获取文本。和&#34;&amp;&#34;。但是格罗克忽略了捕获组并且得到了#34; param1 = 11111&amp;&#34;我只想捕获&#34; 111111&#34;

我怎么说使用捕获组1或告诉grok使用我的正则表达式捕获组?

编辑 这几乎有效:

  grok {
    match => [ "message", "(?<param1>param1=(?<param1>.*?)&)"]
  }

所以我猜测我在这里做的是使用两个命名组,但名称相同。问题是&#34; param1&#34;字段中有两个条目用于每个组。一个用于&#34; param1 = 11111&amp;&#34;和#34; 11111&#34;我如何才能获得第二组?

2 个答案:

答案 0 :(得分:5)

  

我怎么说使用捕获组1或告诉grok使用我的正则表达式捕获组?

默认情况下,grok仅考虑命名的捕获组,编号的捕获组不会触发字段创建。如果要覆盖此行为,请将named_captures_only设置为 false

  

<强> named_captures_only
    - 值类型为boolean
   - 默认值为true
  如果true,则仅存储来自grok的命名捕获。

然而,使用命名的捕获组没有任何问题(我使用了否定的字符类[^&]*而不是使用后面消耗&的惰性匹配点:

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

[^&]*匹配&以外的0个或更多字符,因此也会匹配空参数(您可能希望将*更改为+,或使用keep_empty_captures参数控制)并在字符串的末尾。

enter image description here

答案 1 :(得分:1)

这有效:

  grok {
    match => [ "message", "(?:param1=(?<param1>.*?)&)"]
  }

所以我猜测我在这里做的是使用一个非捕获组,其中嵌入了一个命名的捕获组。因此,父组的匹配将被丢弃,并且嵌套的命名匹配是唯一返回的内容。

这是在做我认为它正在做的事情,还是这是错误的,它的愚蠢运气能够实现我的目标吗?