logstash – 多个Grok过滤器不存储第一个过滤器匹配记录

我使用Logstash来解析postfix日志.我主要集中于从Postfix日志中获取弹出的电子邮件日志,并将其存储在数据库中.

为了获取日志,首先我需要查找与我的message-id相对应的postfix生成的ID,并使用该Id,我需要查找邮件的状态.对于以下配置,我可以获取日志.

grok {
       patterns_dir => "patterns"
       match => [
            "message", "%{SYSLOGBASE} %{POSTFIXCLEANUP}",
            "message", "%{SYSLOGBASE} %{POSTFIXBOUNCE}"
        ]
        named_captures_only => true
    }

我正在使用以下条件来存储与模式匹配的日志:

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”标签和第一个过滤器标签,因为它不存储该记录.

有谁能告诉我需要做些什么来纠正这个问题?我犯错了吗?

最佳答案
您需要保护第二个grok块 – 即如果第一个成功,则不执行它.

if ("BOUNCED" not in [tags]) {
  grok {
    patterns_dir => "patterns"
    match => [
        "message", "%{SYSLOGBASE} %{POSTFIXCLEANUP}"            
    ]
    add_tag => ["INTIALIZATION"]
    remove_tag => ["_grokparsefailure"]
    named_captures_only => true
  }
}

转载注明原文:logstash – 多个Grok过滤器不存储第一个过滤器匹配记录 - 代码日志