logstashgrok-filter正则表达式在调试工具中有效,但在实际执行中失败



我正在尝试从日志行中提取一个文件,我使用http://grokdebug.herokuapp.com/使用调试我的正则表达式

(?<action>(?<=action=).*(?=&))

输入文本如下:

 /event?id=123&action={"power":"on"}&package=1

我得到了这样的结果:

{
  "action": [
   "{"power":"on"}"
 ]
}

但是当我把这个配置复制到我的logstash配置文件时:

input { stdin{} }
filter {
  grok {
    match => { "message" => "(?<action>(?<=action=).*(?=&))"}
  }
}
output { stdout {
  codec => 'json'
}}

输出显示匹配失败:

{"message":" /event?id=123&action={"power":"on"}&package=1","@version":"1","@timestamp":"2016-01-05T10:30:04.714Z","host":"xxx","tags":["_grokparsefailure"]}

我在cygwin中使用logstash-2.1.1。知道为什么会发生这种事吗?

您可能会遇到由贪婪点匹配子模式.*引起的问题。由于您只对action=之后直到下一个&或字符串末尾的文本字符串感兴趣,因此最好使用否定字符类[^&]

所以,使用

[?&]action=(?<action>[^&]*)

[?&]?&匹配,并且在这里用作边界。

它不会回答您的regexp问题,但。。。

将查询字符串解析为一个单独的字段,并对其使用kv{}筛选器。

相关内容

最新更新