微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在自定义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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐