如果其中一个多重格式匹配,则防止_grokparsefailure

时间:2015-06-29 14:18:21

标签: logstash grok

我有这个想法:

grok {
        patterns_dir => "/etc/logstash/patterns/"
        break_on_match => false
        keep_empty_captures => true

        match => [ 
            "message", "(%{EXIM_DATE:exim_date} )(%{EXIM_PID:exim_pid} )(%{EXIM_MSGID:exim_msg_id} )(%{EXIM_FLAGS:exim_flags} )(%{GREEDYDATA})",
            "message", "(%{EXIM_MSGID} )(<= )(%{NOTSPACE:env_sender} )(%{EXIM_REMOTE_HOST} )?(%{EXIM_INTERFACE} )?(%{EXIM_PROTOCOL} )?(X=%{NOTSPACE:tls_info} )?(%{EXIM_MSG_SIZE} )?(%{EXIM_HEADER_ID} )?(%{EXIM_SUBJECT})",
            "message", "(%{EXIM_MSGID} )([=-]> )(%{NOTSPACE:env_rcpt} )(<%{NOTSPACE:env_rcpt_outer}> )?(R=%{NOTSPACE:exim_router} )(T=%{NOTSPACE:exim_transport} )(%{EXIM_REMOTE_HOST} )(X=%{NOTSPACE:tls_info} )?(QT=%{EXIM_QT:exim_qt})",
            "message", "(%{EXIM_DATE:exim_date} )(%{EXIM_PID:exim_pid} )(%{EXIM_MSGID:exim_msg_id} )(Completed )(QT=%{EXIM_QT:exim_qt})",
            "message", "(%{EXIM_DATE:exim_date} )(%{EXIM_PID:exim_pid} )(%{EXIM_MSGID:exim_msg_id} )?(%{EXIM_REMOTE_HOST} )?(%EXIM_INTERFACE} )?(F=<%{NOTSPACE:env_sender}> )?(.+(rejected after DATA|rejected \(but fed to sa-learn\)|rejected [A-Z]+ (or [A-Z]+ %{NOTSPACE}?|<%{NOTSPACE:env_rcpt}>)?): (?<exim_rej_reason>.+))"
        ]
      }

如果我单独测试grok模式,一切都按预期工作,但在生产中有多个匹配它们没有。结果还可以,我解析了所有内容,但每次都有一个_grokparsefailure标记,如果其中一个是匹配的话。我该如何防止这种情况?

标签删除不是我想要的,因为如果没有匹配,则应添加标签,以便我可以删除该消息。

1 个答案:

答案 0 :(得分:1)

失败的原因是您设置了break_on_match,该测试将测试match中的每个条目。这会导致您的一种模式不匹配并设置_grokparsefailure标签。

从外观上看,您的模式是互斥的,因此您无需设置break_on_match并仍然保留功能。