2015-04-15 51 views
2

我有这些日志,我试图从grok每行提取多个信息。但似乎有些比赛没有考虑到,尽管他们对我来说似乎很好。Logstash 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字段,但所有其他字段都已丢失(wtb,name,eans)。我不知道为什么。自从添加最后一个模式后,它在成功匹配后不会停止。任何人都可以发现我错过的东西吗?

+0

[grok refence页面上的语法](https://www.elastic.co/guide/en/logstash/current/plugins-filters-grok.html#plugins-filters-grok-match)适合我与多个比赛。 – Matthias

回答

5

简单的答案是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只有一个msg模式。

+0

我们应该始终阅读源代码,你是对的。是的,这就是我最终做的,打破了不同groks中的msg模式。 – Antoine