如何处理不匹配的Logstash grokfilter
我想知道什么是我的Logstash Grokfilter采取的最佳方法。 我有一些针对特定日志条目的filter,并不适用于所有条目。 不适用的总是生成_grokparsefailure标签。 例如,我有一个grokfilter是每个日志条目,它工作正常。 然后我有另一个filter是用于回溯错误消息。 回溯filter会为每个没有回溯的日志条目引发grokparsefailure。
如果没有匹配而不是添加parsefailure标记,我宁愿通过规则。 我使用parsefailure标签来查找不正确parsing的东西,而不是简单地不匹配特定filter的东西。 也许这只是命名“parsing失败”,让我。 对我来说,这意味着filter有问题(例如格式不正确),而不是不匹配。
所以问题是,我该如何处理呢?
-
使filter模式可选使用?
-
(ab)将tag_on_failure选项设置为nothing []
-
使过滤条件使用像“如果回溯消息”
-
别的什么我不考虑?
提前致谢。
编辑
我采取了添加条件的filter的path:
if [message] =~ /took\s\d+/ { grok { patterns_dir => "/etc/logstash/patterns" match => ["message", "took\s+(?<servicetime>[\d\.]+)"] add_tag => [ "stats", "servicetime" ] } }
仍然对反馈感兴趣。 这里被认为是“最佳实践”?
如果可能的话,我会用一个有条件的包装 ,就像你正在使用的包装一样。 随意张贴,作为一个答案!
如果您的应用程序只生成几种不同的行格式,则可以使用grokfilter使用多个匹配模式。 默认情况下,filter将处理到第一次成功的匹配:
grok { patterns_dir => "./patterns" match => [ "message", "%{BASE_PATTERN} %{EXTRA_PATTERN}", "message", "%{BASE_PATTERN}", "message", "%{SOME_OTHER_PATTERN}" ] }
如果你的逻辑不那么简单(也许你需要多次检查相同的条件), grepfilter可以用来添加标签。 像这样的东西:
grep { drop => false #grep normally drops non-matching events match => ["message", "/took\s\d+/"] add_tag => "has_traceback" } ... if "has_traceback" in [tags] { ... }
您还可以将tag_on_failure => []
添加到tag_on_failure => []
节中,如下所示:
grok { match => ["context", "\"tags\":\[%{DATA:apptags}\]"] tag_on_failure => [ ] }
grok仍然会失败,但是不会添加到标签数组中。
你也可以做到这一点
remove_tag => [“_grokparsefailure”]
每当你有一场比赛。
这是做这件事的最有效的方法。 忽略filter
filter { grok { match => [ "message", "something"] } if "_grokparsefailure" in [tags] { drop { } } }