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

Spa*_*nky 50 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" ]
        }
    }
Run Code Online (Sandbox Code Playgroud)

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

rut*_*ter 37

如果可能的话,我会使用条件包装器,就像你正在使用的那个一样.随意张贴作为答案!

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

grok {
    patterns_dir => "./patterns"
    match => {
        "message" => [ 
              "%{BASE_PATTERN} %{EXTRA_PATTERN}",
              "%{BASE_PATTERN}",
              "%{SOME_OTHER_PATTERN}"
        ]
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您的逻辑不那么简单(可能需要多次检查相同的条件),grep过滤器可用于添加标记.像这样的东西:

grep {
    drop => false #grep normally drops non-matching events
    match => ["message", "/took\s\d+/"]
    add_tag => "has_traceback"
}


...

if "has_traceback" in [tags] {
    ...
}
Run Code Online (Sandbox Code Playgroud)

  • 我明白你的观点,但也注意到你没有提供替代解决方案.有了几个月的经验,我知道一个空的`tag_on_failure`可能适用于某些用例...但我也知道解析失败的行为几乎没有记录,并且将来可能会发生变化. (9认同)
  • 哦,它匹配=> {"message"=> ["持续时间:%{NUMBER:持续时间}","速度:%{数字:速度}"]} (4认同)
  • 这违反了DRY原则.您不能首先匹配消息以查看是否应匹配消息.特别是因为它不是启发式的; 如果条件满足则消息必须匹配,否则grok失败. (2认同)
  • 感谢@StefanK.找到了正确的语法. (2认同)

Gar*_*ers 22

您还可以tag_on_failure => []像这样添加到您的grok节:

grok {
    match => ["context", "\"tags\":\[%{DATA:apptags}\]"]
    tag_on_failure => [ ]
}
Run Code Online (Sandbox Code Playgroud)

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


JAR*_*JAR 8

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

filter {

        grok {
            match => [ "message", "something"]
    }

    if "_grokparsefailure" in [tags] {
            drop { }
        }
}
Run Code Online (Sandbox Code Playgroud)