首页 文章

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

提问于
浏览
10

我正在使用Logstash来解析postfix日志 . 我主要专注于从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
    }

现在,它只存储%模式日志 . 如果我颠倒了订单,它只存储%模式 .

因此,在删除if条件之后,我发现从第一个过滤器解析的消息具有“_grokparsefailure”标记和第一个过滤器标记,因此它不存储该记录 .

任何人都可以告诉我需要做些什么来纠正这个问题?我有没有犯错?

1 回答

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

相关问题