我想知道使用Logstash Grok过滤器的最佳方法是什么。我有一些特定日志条目的过滤器,不适用于所有条目。那些不适用的标签始终生成_grokparsefailure标签。例如,我有一个grok过滤器,用于每个日志条目,它工作正常。然后我有另一个过滤器,用于带有回溯的错误消息。回溯过滤器为每个没有回溯的日志条目抛出一个grokparsefailure。
如果没有匹配而不是添加parsefailure标记,我宁愿让它通过规则。我使用parsefailure标签来查找未正确解析的内容,而不是与特定过滤器不匹配的内容。也许只是命名“解析失败”才能得到我。对我而言,这意味着过滤器出现了问题(例如格式错误),而不是它不匹配。
所以问题是,我该如何处理?
使用?
(ab)使用tag_on_failure选项将其设置为空[]
使用“if ifback in message”
其他我不考虑的事情?
提前致谢。
修改 的
我采取了在过滤器周围添加条件的路径:
if [message] =~ /took\s\d+/ {
grok {
patterns_dir => "/etc/logstash/patterns"
match => ["message", "took\s+(?<servicetime>[\d\.]+)"]
add_tag => [ "stats", "servicetime" ]
}
}
仍然对反馈感兴趣。什么被认为是“最佳实践”?
答案 0 :(得分:36)
如果可能的话,我会使用conditional wrapper,就像你正在使用的那个一样。随意将其作为答案发布!
如果您的应用程序只生成几种不同的行格式,则可以使用grok filter的多个匹配模式。默认情况下,过滤器将处理第一次成功匹配:
grok {
patterns_dir => "./patterns"
match => {
"message" => [
"%{BASE_PATTERN} %{EXTRA_PATTERN}",
"%{BASE_PATTERN}",
"%{SOME_OTHER_PATTERN}"
]
}
}
如果您的逻辑不那么简单(可能需要多次检查相同的条件),grep filter可用于添加标记。像这样:
grep {
drop => false #grep normally drops non-matching events
match => ["message", "/took\s\d+/"]
add_tag => "has_traceback"
}
...
if "has_traceback" in [tags] {
...
}
答案 1 :(得分:21)
您还可以将tag_on_failure => []
添加到您的grok节,如下所示:
grok {
match => ["context", "\"tags\":\[%{DATA:apptags}\]"]
tag_on_failure => [ ]
}
grok仍会失败,但会在不添加标签数组的情况下执行此操作。
答案 2 :(得分:7)
这是最有效的方法。忽略过滤器
filter {
grok {
match => [ "message", "something"]
}
if "_grokparsefailure" in [tags] {
drop { }
}
}
答案 3 :(得分:4)
你也可以这样做
remove_tag =&gt; [&#34; _grokparsefailure&#34; ]
每当你有比赛时。