input {
file {path => "/var/log/mail.log"}
}
filter {
kv {
trim => "<>"
}
if [message] =~ /[ "status=bounced" ]/ {
grok {
patterns_dir => "/etc/logstash/patterns"
match => {"message" => "%{SYSLOGBASE} (?<QID>[0-9A-F]{10}): %{GREEDYDATA:message}"}
add_tag => "bounce"
}
}
}
output {
if "bounce" in [tags] {
stdout { codec => rubydebug }
}
}
mail.log的示例:
Jul 26 04:18:34 mx12 postfix / cleanup [20659]: 3mfHGL1r9gzyQP : message-id =&lt; 3mfHGL1r9gzyQP@www.mydomain.fr>
Jul 26 04:18:34 mx12 postfix / smtp [20662]: 3mfHGL1r9gzyQP :to =,relay = 127.0.0.2 [127.0.0.2]:25,delay = 0.53,延迟= 0.13 /0 / 0.23 / 0.16,dsn = 2.0.0,状态=发送 / 退回
结果1:
我发送电子邮件到现有的电子邮件地址,mail.log中的状态为:
发送(250 ok):OKAY
但这是Logstash所说的:
..我看到每个postfix程序生成的每条消息(qmgr,smtp,qmgr再次..)。换句话说,对于所有甚至不包含“status = bounced”的消息。
然后我也试过了:
if [message] =~ /[ "bounced" ]/ {
mutate {add_tag => [ "bounce" ]}
}
if [message] =~ /[ "message-id", "(.*)\@www\.mydomain\.fr" ]/ {
mutate { add_tag => [ "send" ] }
}
grok {
match => {"message" => "%{SYSLOGBASE} (?<QID>[0-9A-F]{10}): %{GREEDYDATA:message}"}
}
结果2: Logstash总是添加2个标签:bounce + send :(
预期结果:
我尝试做的是确切地说这个配置文件,但它是用旧版本的Logstash 制作的(例如“grep”现在不可用),但这正是我尝试做什么:
http://tales.itnobody.com/2013/07/using-logstash-to-log-smtp-bounces-like-a-boss.html
总之:
如下:
output{
if "bounce" in [tags] {
exec {
command => "php -f /path/LogDSN.php %{QID} %{dsn} &"
}
}
if "send" in [tags] {
exec {
command => "php -f /path/LogOutbound.php %{QID} %{message-id} &"
}
}
}
但我的过滤器中存在问题,这让我很疯狂,
任何想法??
答案 0 :(得分:1)
我找到了问题。
这是来自这个测试:
if [message] =~ /[ "bounced" ]/ {
mutate {add_tag => [ "bounce" ]}
}
正则表达式是/
之间的部分,所以你的正则表达式是这样计算的:
https://regex101.com/r/eaB5jp/2
所以你的所有行都会匹配并获得标记。
为了工作,测试应该是:
if [message] =~ /bounced/ {
mutate {add_tag => [ "bounce" ]}
}