代码之家  ›  专栏  ›  技术社区  ›  Julien

Logstash grok过滤器,用于标记接收到的消息和弹回的消息

  •  1
  • Julien  · 技术社区  · 9 年前

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

    7月26日04:18:34 mx12修复/清理[20659]: : 消息id=<3mfHGL1r9gzyQP@www.mydomain.fr>

    7月26日04:18:34 mx12后缀/smtp[20662]: 3mfHGL1或9gzyQP :to=,继电器=127.0.0.2[127..0.0.2]:25,延迟=0.53,延迟=0.13/0/0.23/0.16,dsn=2.0.0, status=已发送 / 反弹的


    结果1:

    我发送电子邮件到现有的电子邮件地址,状态在邮件中。日志是:

    但洛格斯塔什告诉我们:

    enter image description here

    ..我看到每个postfix程序生成的每条消息(qmgr、smtp、qmgr再次出现..)。换句话说,对于所有不包含“status=bounched”的消息。

    然后我还尝试了:

       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 RECORD:QID,DSN的任何条目
    2. 与邮件id匹配的任何条目=<hashRegex(哈希正则表达式)>记录:QID,消息id

    具体如下:

        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 回复  |  直到 9 年前
        1
  •  1
  •   baudsp Alain Collins    9 年前

    我发现了问题。

    它来自这个测试:

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

    正则表达式是介于 / ,因此regex的计算方式如下: https://regex101.com/r/eaB5jp/2

    所以你所有的线都会匹配并得到标签。

    为了工作,测试应:

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