我有这些日志,我试图用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,该事件具有referer
与host
添加字段,但所有的人失踪(wtb
,name
,eans
)。我不知道为什么。自从添加最后一个模式以来,在成功匹配后它不会停止。谁能发现我所缺少的东西?
简单的答案是,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
以便msg
每个只能有一个模式grok
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句