如何处理不匹配的Logstash grok过滤器

时间:2013-12-30 23:57:43

标签: filter logstash logstash-grok

我想知道使用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" ]
        }
    }

仍然对反馈感兴趣。什么被认为是“最佳实践”?

4 个答案:

答案 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; ]

每当你有比赛时。