这是一个示例日志行:
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 =”和“&”之间的文本.但是格罗克忽略了捕获组并获得了“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 istrue
Iftrue
,only store named captures from grok.
但是,使用命名捕获组没有任何问题(我使用了一个否定的字符类[^&] *而不是一个带有消耗&延迟的匹配点):
\bparam1=(?<param1>[^&]*)
[^&] *匹配除&之外的0个或更多个字符,因此也匹配空参数(您可能希望通过更改*来避免,或使用keep_empty_captures参数控制)和字符串末尾.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。