Logstash grok过滤器标记已接收和退回的邮件

时间:2016-10-02 21:01:22

标签: regex nginx elasticsearch logstash logstash-grok

sthg让我发疯,我想解析Postfix日志以了解电子邮件的状态,这是我到目前为止所尝试的:

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所说的:

enter image description here

..我看到每个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

总之:

  1. 任何带有DSN的条目 - 记录:QID,dsn
  2. 任何匹配message-id =&lt;的条目hashRegex&gt; - RECORD:QID,message-id
  3. 如下:

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

    但我的过滤器中存在问题,这让我很疯狂,

    任何想法??

1 个答案:

答案 0 :(得分:1)

我找到了问题。

这是来自这个测试:

if [message] =~ /[ "bounced" ]/ {
  mutate {add_tag => [ "bounce" ]}
}

正则表达式是/之间的部分,所以你的正则表达式是这样计算的: https://regex101.com/r/eaB5jp/2

所以你的所有行都会匹配并获得标记。

为了工作,测试应该是:

if [message] =~ /bounced/ {
  mutate {add_tag => [ "bounce" ]}
}