如何处理不匹配的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 { } } }