仅当邮件同时通过两个过滤器而不是失败时,如何应用解析失败标记?

问题描述

我的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标签。我想删除标记,并且仅在两个过滤器均失败时才应用解析失败标记。有可能吗?

解决方法

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" ]
  }
}

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