【问题标题】:How to handle non-matching Logstash grok filters如何处理不匹配的 Logstash grok 过滤器
【发布时间】:2013-12-30 23:57:43
【问题描述】:

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

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

那么问题来了,我该如何处理呢?

  • 使用 ? 使过滤器模式可选?

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

  • 使用类似“if traceback in message”之类的内容使过滤器成为条件过滤器

  • 还有什么我不考虑的?

提前致谢。

编辑

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

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

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

【问题讨论】:

    标签: filter logstash logstash-grok


    【解决方案1】:

    如果可能,我会使用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] {
        ...
    }
    

    【讨论】:

    • 这违反了 DRY 原则。不可能是您首先必须匹配一条消息才能查看是否应该匹配一条消息。特别是因为它不是启发式的;如果满足条件,则消息必须匹配,否则 grok 失败。
    • 我明白你的意思,但也注意到你没有提供替代解决方案。有了几个月的经验,我知道空的tag_on_failure 可能适用于某些用例......但我也知道解析失败的行为几乎没有记录,并且将来可能会发生变化。
    • match => [ "message", "a", "message", "b", "message", "c" ] 导致错误。
    • 哦,匹配 => { "message" => [ "Duration: %{NUMBER:duration}", "Speed: %{NUMBER:speed}" ] }
    • 感谢@StefanK。因为找到了正确的语法。
    【解决方案2】:

    您也可以像这样将tag_on_failure =&gt; [] 添加到您的grok 节中:

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

    grok 仍然会失败,但不会添加到 tags 数组中。

    【讨论】:

    • 我认为这是最标准的做法。
    • 这样很好,您可以创建对 grok 一无所知的人也可以理解的失败标签
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      你也可以这样做

      remove_tag => [ "_grokparsefailure" ]

      只要你有比赛。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-07-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-04-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多