首页 文章

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

提问于
浏览
48

我想知道使用我的Logstash Grok过滤器的最佳方法是什么 . 我有一些特定日志条目的过滤器,不适用于所有条目 . 那些不适用的标签始终生成_grokparsefailure标签 . 例如,我有一个grok过滤器,用于每个日志条目,它工作正常 . 然后我有另一个过滤器,用于带有回溯的错误消息 . 回溯过滤器为每个没有回溯的日志条目抛出grokparsefailure .

如果没有匹配而不是添加parsefailure标记,我宁愿让它通过规则 . 我使用parsefailure标记来查找未正确解析的内容,而不是与特定过滤器不匹配的内容 . 也许只是命名“解析失败”才能得到我 . 对我来说,这意味着过滤器有问题(例如格式错误),而不是它不匹配 .

所以问题是,我该如何处理?

  • 使用过滤模式可选吗?

  • (ab)使用tag_on_failure选项将其设置为空[]

  • 使用类似“如果消息中的跟踪”的条件使过滤器有条件

  • 别的什么我不考虑?

提前致谢 .

EDIT

我采取了在过滤器周围添加条件的路径:

if [message] =~ /took\s\d+/ {
        grok {
            patterns_dir => "/etc/logstash/patterns"
            match => ["message", "took\s+(?<servicetime>[\d\.]+)"]
            add_tag => [ "stats", "servicetime" ]
        }
    }

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

4 回答

  • 35

    如果可能的话,我会像你正在使用的那样使用conditional wrapper . 随意张贴作为答案!

    如果您的应用程序只生成几种不同的行格式,则可以将多个匹配模式与grok filter一起使用 . 默认情况下,过滤器将处理第一次成功匹配:

    grok {
        patterns_dir => "./patterns"
        match => [
            "message", "%{BASE_PATTERN} %{EXTRA_PATTERN}",
            "message", "%{BASE_PATTERN}",
            "message", "%{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] {
        ...
    }
    
  • 4

    这是最有效的方法 . 忽略过滤器

    filter {
    
            grok {
                match => [ "message", "something"]
        }
    
        if "_grokparsefailure" in [tags] {
                drop { }
            }
    }
    
  • 18

    你也可以这样做

    remove_tag => [“_ greenkparsefailure”]

    只要你有比赛 .

  • 7

    您也可以将 tag_on_failure => [] 添加到您的grok节中,如下所示:

    grok {
        match => ["context", "\"tags\":\[%{DATA:apptags}\]"]
        tag_on_failure => [ ]
    }
    

    grok仍然会失败,但是会在不添加标签数组的情况下完成 .

相关问题