首页 > 解决方案 > 仅当消息失败两个过滤器而不是一个过滤器时,如何应用解析失败标记?

问题描述

我的 logtash 配置有两个过滤器:1)解析日志消息和 2)解析 JSON 消息:

filter {
  grok {
    match => { "message" =>
    "\[%{TIMESTAMP_ISO8601:log_time}\]\[%{LOGLEVEL:log_level}(?<space>\s*)\]\[%{DATA:thread_name}\]\[%{DATA:class_name}\]%{GREEDYDATA:log_msg}" }
  }
  json {
    source => "message"
    add_tag => ["RiskExplain"]
  }
}

目前,如果记录了 JSON 消息,它将在被 json 过滤器解析之前使 grok 过滤器失败。因为它没有通过第一个过滤器,所以它会收到一个_grokparsefailure标签。我想删除此标签,并且仅在两个过滤器均未通过时才应用解析失败标签。那可能吗?

标签: logstashlogstash-groklogstash-json

解决方案


grok {
  match => { "message" =>
    "\[%{TIMESTAMP_ISO8601:log_time}\]\[%{LOGLEVEL:log_level}(?<space>\s*)\]\[%{DATA:thread_name}\]\[%{DATA:class_name}\]%{GREEDYDATA:log_msg}" }
}
if "_grokparsefailure" in [tags] {
  json {
    source => "message"
    add_tag => ["RiskExplain"]
    tag_on_failure => ["The_Tag_You_Want"]
    remove_tag => [ "_grokparsefailure" ]
  }
}

这样 json 过滤器将仅在 grok 过滤器无法解析消息时使用。json 过滤器将删除_grokparsefailure标签,如果失败,将添加The_Tag_You_Want标签。


推荐阅读