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

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

所以这个正则表达式使用一个捕获组来获取“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 is true
If true, only store named captures from grok.



但是,使用命名的捕获组并没有错(我将使用否定字符类 [^&]* 而不是惰性匹配点,其后带有消耗的 &):
\bparam1=(?<param1>[^&]*)
[^&]*匹配除 & 之外的 0 个或多个字符,因此也将匹配空参数(您可能希望通过将 * 更改为 + 来避免,或使用 keep_empty_captures 参数进行控制)和字符串的末尾。

enter image description here

关于regex - 如何在自定义 grok 模式中引用正则表达式组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42754286/

相关文章:

elasticsearch - Kibi可以与Elasticsearch 5.2一起使用吗?

regex - 如何使用logstash过滤器处理多行日志条目?

elasticsearch - Logstash kibana geoip 过滤器冲突

c - 我如何使用变量类型标记此输入行,以便我可以决定保存我的信息的结构的大小?

javascript - 如何查找字符串中无效的十六进制值?

regex - notepad++正则表达式查找并替换括号之间的空格

mysql - Elasticsearch 查询: Sum + Case Equivalent?

javascript - 如何制作有效的多行 Javascript REGEX

elasticsearch - elasticsearch精确匹配的字符串包括点

elasticsearch - 是否可以从Packetbeat中的请求中看到HTTP POST数据?