我正在使用Logstash来解析后缀日志。我主要专注于从postfix日志中获取退回的电子邮件日志,并将其存储在数据库中。
为了获取日志,首先我需要查找与我的message-id对应的postfix生成的ID,并使用该Id,我需要查找电子邮件的状态。对于以下配置,我可以获取日志。
grok {
patterns_dir => "patterns"
match => [
"message", "%{SYSLOGBASE} %{POSTFIXCLEANUP}",
"message", "%{SYSLOGBASE} %{POSTFIXBOUNCE}"
]
named_captures_only => true
}
我使用以下if条件来存储与模式匹配的日志:
if "_grokparsefailure" not in [tags] {
#database call
}
如您所见,我使用两种模式从一个日志文件中查找相应的两个不同日志。
现在,我想根据标签区分这两种模式。所以我修改了我的配置如下:
grok {
patterns_dir => "patterns"
match => [
"message", "%{SYSLOGBASE} %{POSTFIXBOUNCE}"
]
add_tag => ["BOUNCED"]
remove_tag => ["_grokparsefailure"]
named_captures_only => true
}
grok {
patterns_dir => "patterns"
match => [
"message", "%{SYSLOGBASE} %{POSTFIXCLEANUP}"
]
add_tag => ["INTIALIZATION"]
remove_tag => ["_grokparsefailure"]
named_captures_only => true
}
现在,它只存储%{POSTFIXCLEANUP}模式日志。如果我颠倒了订单,它只会存储%{POSTFIXBOUNCE}模式。
所以,在删除if条件之后,我发现从第一个过滤器解析的消息有" _grokparsefailure"标记和第一个过滤器标记,因此它不存储该记录。
有人能告诉我需要做些什么来纠正这个问题吗?我有没有犯错?
答案 0 :(得分:12)
你需要保护第二个grok块 - 即如果第一个成功,就不要执行它。
if ("BOUNCED" not in [tags]) {
grok {
patterns_dir => "patterns"
match => [
"message", "%{SYSLOGBASE} %{POSTFIXCLEANUP}"
]
add_tag => ["INTIALIZATION"]
remove_tag => ["_grokparsefailure"]
named_captures_only => true
}
}