从 logstash grok 过滤器中的消息中获取可选字段

Getting optional field out of message in logstash grok filter

我正在尝试提取此日志行中的毫秒数

20190726160424 [INFO] [concurrent/forasdfMES-managedThreadFactory-Thread-10] - Metricsdceptor: ## End of call: Historirrtory.getHistrrOrder took 2979 ms

问题是,并非所有日志行都包含该字符串 现在我想有选择地将它提取到持续时间字段中。我试过了,但什么也没发生....没有错误,但也没有结果。

 grok
 {
   match => ["message", "(took (?<duration>[\d]+) ms)?"]
 }

我做错了什么?

谢谢大家!

我无法解释为什么,但如果你锚定它,它就会起作用

grok { match => { "message" => "(took (?<duration>\d+) ms)?$" } }

一个解决方案是只在以 ms 结尾的日志行上应用 grok 过滤器。可以在您的配置中使用 conditionals 来完成。

if [message] =~ /took \d+ ms$/ {
   grok {
     match => ["message", "took %{NUMBER:duration} ms"]
   }
}