logstash grok 过滤器正则表达式在调试工具中有效但在实际执行中失败

logstash grok filter regular expression works in debug tool but failed in actual execution

我正在尝试从日志行中提取一个文件,我使用 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。 知道为什么会这样吗?

它没有回答您的正则表达式问题,但是...

将查询字符串解析为单独的字段并对其使用 kv{} 过滤器。

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

所以,使用

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

[?&] 匹配 ?& 并在此处用作边界。