Logstash grok 过滤器不适用于最后一个字段

Joh*_*Lim 5 logstash logstash-grok

在 Logstash 2.3.3 中,grok 过滤器不适用于最后一个字段。

要重现该问题,请创建test.conf如下:

input {
  file {
    path => "/Users/izeye/Applications/logstash-2.3.3/test.log"
  }
}

filter {
  grok {
    match => { "message" => "%{DATA:id1},%{DATA:id2},%{DATA:id3},%{DATA:id4},%{DATA:id5}" }
  }
}

output {
  stdout {
    codec => rubydebug
  }
}
Run Code Online (Sandbox Code Playgroud)

跑步./bin/logstash -f test.conf

启动后,在另一个终端运行echo "1,2,3,4,5" >> test.log

我得到以下输出:

Johnnyui-MacBook-Pro:logstash-2.3.3 izeye$ ./bin/logstash -f test.conf 
Settings: Default pipeline workers: 8
Pipeline main started
{
       "message" => "1,2,3,4,5",
      "@version" => "1",
    "@timestamp" => "2016-07-07T07:57:42.830Z",
          "path" => "/Users/izeye/Applications/logstash-2.3.3/test.log",
          "host" => "Johnnyui-MacBook-Pro.local",
           "id1" => "1",
           "id2" => "2",
           "id3" => "3",
           "id4" => "4"
}
Run Code Online (Sandbox Code Playgroud)

你可以看到失踪的id5

我不确定这是一个错误还是配置错误。

任何提示将不胜感激。

bau*_*dsp 5

我认为这是因为DATA模式是如何定义的。它的正则表达式是.*?,所以这是一个惰性匹配。这不是一个错误,而是正则表达式的工作原理(示例)。
但您可能想问一个正则表达式问题以获得准确的答案。

作为解决方案,您可以将最后一个替换DATANUMBER(或适合您情况的内容)。GREEDYDATA也会起作用。


不过,在该解决方案中,csvdissect过滤器可能更适合,因为更容易配置且性能更高。