53

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

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

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

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

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

  • 使用“如果在消息中回溯”之类的内容使过滤器有条件

  • 还有什么我不考虑的?

提前致谢。

编辑

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

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

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

4

4 回答 4

37

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

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

grok {
    patterns_dir => "./patterns"
    match => {
        "message" => [ 
              "%{BASE_PATTERN} %{EXTRA_PATTERN}",
              "%{BASE_PATTERN}",
              "%{SOME_OTHER_PATTERN}"
        ]
    }
}

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

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


...

if "has_traceback" in [tags] {
    ...
}
于 2014-01-02T20:31:22.280 回答
24

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

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

grok 仍然会失败,但会在不添加到 tags 数组的情况下这样做。

于 2014-08-25T18:01:42.587 回答
8

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

filter {

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

    if "_grokparsefailure" in [tags] {
            drop { }
        }
}
于 2017-04-18T22:23:40.867 回答
4

你也可以这样做

remove_tag => [“_grokparsefailure”]

每当你有比赛时。

于 2014-04-23T23:05:39.177 回答