问题描述
我的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
标签。