Filter 如何处理不匹配的Logstash grok筛选器

Filter 如何处理不匹配的Logstash grok筛选器,filter,logstash,logstash-grok,Filter,Logstash,Logstash Grok,我想知道我的Logstash Grok过滤器的最佳方法是什么。我有一些针对特定日志条目的过滤器,但不会应用于所有条目。不适用的标记总是生成_grokparsefailure标记。例如,我有一个适用于每个日志条目的grok过滤器,它工作正常。然后我有另一个过滤器,用于跟踪错误消息。回溯筛选器为每个没有回溯的日志条目抛出grokparsefailure 如果没有匹配项,我宁愿让它通过规则,而不是添加parsefailure标记。我使用parsefailure标记查找未正确解析的内容,而不是与特定筛选

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

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

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

  • 使用以下选项使过滤器模式可选

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

  • 使用类似“消息中的if traceback”的内容使筛选器有条件

  • 还有什么我没有考虑的

提前谢谢

编辑

我采用了在过滤器周围添加条件的方法:

    if [message] =~ /took\s\d+/ {
        grok {
            patterns_dir => "/etc/logstash/patterns"
            match => ["message", "took\s+(?<servicetime>[\d\.]+)"]
            add_tag => [ "stats", "servicetime" ]
        }
    }
如果[消息]=~/take\s\d+/{
格罗克{
patterns\u dir=>“/etc/logstash/patterns”
匹配=>[“消息”,“接受\s+(?[\d\.]+)”]
添加标签=>[“统计”、“服务时间”]
}
}

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

如果可能的话,我会选择与您使用的一样的。请随意将其作为答案发布

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

grok {
    patterns_dir => "./patterns"
    match => {
        "message" => [ 
              "%{BASE_PATTERN} %{EXTRA_PATTERN}",
              "%{BASE_PATTERN}",
              "%{SOME_OTHER_PATTERN}"
        ]
    }
}
如果您的逻辑不那么简单(可能需要多次检查相同的条件),则添加标记可能会很有用。大概是这样的:

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


...

if "has_traceback" in [tags] {
    ...
}
你也可以这样做

删除标签=>[“\u grokparsefailure”]


只要有匹配项。

您也可以在grok节中添加
tag\u on\u failure=>[]
,如下所示:

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

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

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

filter {

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

    if "_grokparsefailure" in [tags] {
            drop { }
        }
}

这违反了干燥原则。不可能是您首先必须匹配一条消息才能查看是否应该匹配一条消息。特别是因为它不是一个启发式的;如果条件满足,消息必须匹配,否则grok失败。我明白你的意思,但也注意到你没有提供其他解决方案。再加上几个月的经验,我知道一个空的
tag\u on\u failure
可能适用于某些用例。。。但是我也知道解析失败的行为几乎没有文档记录,将来可能会发生更改。match=>[“message”,“a”,“message”,“b”,“message”,“c”]会导致错误。噢,这是match=>{“message”=>[“Duration:%{NUMBER:Duration}”,“Speed:%{NUMBER:Speed}]}感谢@StefanK。感谢您找到了正确的语法。我认为这是最标准的方法。很好,通过这种方法,您可以创建对grok一无所知的人也可以理解的失败标记