【问题标题】:Logstash grok multiple matches failureLogstash grok 多个匹配失败
【发布时间】:2015-04-16 01:58:45
【问题描述】:

我有这些日志,我试图用 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)。我不知道为什么。自添加最后一个模式以来,它不会在成功匹配后停止。谁能发现我错过了什么?

【问题讨论】:

标签: logstash logstash-grok


【解决方案1】:

简单的答案是 grok 不能那样工作。它的实现方式只匹配给定键的 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,这样每个grok只有一个msg模式。

【讨论】:

  • 我们应该一直阅读源代码,你是对的。是的,这就是我最终所做的,打破了不同 grok 中的 msg 模式。
猜你喜欢
  • 1970-01-01
  • 2017-05-14
  • 2017-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多