Logstash grok 多次匹配失败
Logstash grok multiple matches failure
我有这些日志,我在其中尝试使用 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 堆。
所以,为了做你想做的事,你需要打破你的 grok
,这样每个 grok
.
只有一个 msg
模式
我有这些日志,我在其中尝试使用 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 堆。
所以,为了做你想做的事,你需要打破你的 grok
,这样每个 grok
.
msg
模式