首页 > 解决方案 > 如何通过不匹配模式的 kv 过滤器排除解析事件

问题描述

我正在解析来自 UTM 解决方案的许多守护进程的日志。Grok 和 kv 配置如下所示:

 grok {
      match => [ "message", "%{SYSLOGPROG} %{NOTSPACE:syslog_hostname} %{DATA:syslog_program}(?:\[%{POSINT:syslog_pid}\])?: %{GREEDYDATA:syslog_message}" ]
    }
    kv {
      id => "syslogkv"
      source => "syslog_message"
      trim_key => " "
      trim_value => " "
      value_split => "="
      field_split => " "
    }

通常事件看起来像

    <30>2019:04:23-20:13:38 hostname ulogd[5354]: id="2001" severity="info" sys="SecureNet" sub="packetfilter" name="Packet dropped" action="drop" fwrule="60002" initf="eth3.5" outitf="eth5" srcmac="c8:9c:1d:af:68:7f" dstmac="00:1a:8c:f0:f5:23" srcip="x.x.x.x" dstip="y.y.y.y" proto="17" length="56" tos="0x00" prec="0x00" ttl="63" srcport="5892" dstport="53" 

并解析没有任何问题

但是当一些守护进程生成看起来像的事件时(例如 WAF)

<139>2019:04:23-16:21:38 hostname httpd[1475]: [security2:error] [pid 1475:tid 3743300464] [client x.x.x.x] ModSecurity: Warning. Pattern match "([\\\\~\\\\!\\\\@\\\\#\\\\$\\\\%\\\\^\\\\&\\\\*\\\\(\\\\)\\\\-\\\\+\\\\=\\\\{\\\\}\\\\[\\\\]\\\\|\\\\:\\\\;\\"\\\\'\\\\\\xc2\\xb4\\\\\\xe2\\x80\\x99\\\\\\xe2\\x80\\x98\\\\`\\\\<\\\\>].*?){8,}"

我的输出中断,logstash 停止处理任何日志。如何通过正则表达式或任何模式排除 kv 解析事件?简单来说 - 如果 syslog_message 中的第一个单词以“[”或任何其他正则表达式开头,则不要使用 kv。

标签: elasticsearchfilterlogstashkivy-language

解决方案


将您的 kv 过滤器包装在该字段的条件中:

if [syslog_message] !~ /^\[/ {
    kv { }
}

推荐阅读