Logstash grok多次匹配失败

时间:2015-04-15 13:53:56

标签: logstash logstash-grok

我有这些日志,我试图用grok从每行中提取多个信息。但似乎没有考虑到一些比赛,虽然它们对我来说似乎很好。

这是一个示例行:

"#wtb# GetSP ok. Referer:http://test.redacted.com/path?query=string. Wtb:535e2554bdfdf33a22f564d0. Name:Client. Eans:3017565410073."

而且他是' conf文件的相关部分:

grok{
  break_on_match => false
  match => [
    "msg", "Referer:%{URI:referer}\.",
    "msg", "Wtb:%{WORD:wtb}",
    "msg", "Name:(?<name>[^\.]+)",
    "msg", "Eans:(?<eans>[\d,]+)",
    "referer", "https?://%{HOSTNAME:host}"
  ]
  tag_on_failure => []
}

我使用多个匹配,因为每一行可以是样本中给出的各种参数的任意组合 在Kibana中,事件添加了refererhost字段,但缺少所有其他字段(wtbnameeans)。我不知道为什么。自添加最后一个模式后,它在成功匹配后不会停止。谁能发现我失踪的东西?

1 个答案:

答案 0 :(得分:5)

简单的答案是,格罗克并没有这样做。它的实现方式,它只匹配给定键的grok列表中的第一个模式。

如果您查看jls-grok-0.10.12/lib/grok/pure/pile.rb的源代码,您会看到:

def match(string)
  @groks.each do |grok|
    match = grok.match(string)
    if match
      return [grok, match]
    end
  end
  return false
end # def match

这基本上导致它在第一场比赛后停止给定键的grok堆。

为了做你想做的事,你需要打破你的grok,这样每msg只有一个grok模式。