Logstash条件不匹配

时间:2016-08-19 08:08:19

标签: logstash-grok elastic-stack logstash-configuration

我试图匹配条件过滤器中的子字符串,但它似乎不起作用。

我有这样的日志:

<30>ddns[21535]: Dynamic DNS update for xxx (Duck DNS) successful

我正在尝试匹配日志的ddns部分,因为日志也可以由不同的服务发送。

目前我的过滤器如下所示: 过滤{

if [program] =~ "ddns" {
    grok {
        match => { "message" => "<%{PROG:syslog_pri}>%{DATA:program}[%{INT:pid}]: %{GREEDYDATA:syslog_message}" }
        add_field => [ "received_at", "%{@timestamp}" ]
    }
}
    syslog_pri { }

    date {
        match => [ "syslog_timestamp", "yyyy:MM:dd-HH:mm:ss" ]
    }

    mutate {
        replace => [ "@source_host", "sflne01.sarandasnet.local" ]
        replace => [ "@message", "%{syslog_message}" ]
        remove_field  => [ "syslog_message", "syslog_timestamp" ]
    }
}

我也尝试使用if [program] =~ /^ddns$/,但没有成功。

更新配置:

filter {
################
# START IPFIRE #
################
if [host] =~ /172\.16\.0\.1/ {
    if [program] =~ /(?:k|kernel)/ {
        grok {
            match => { "message" => "<%{PROG:syslog_pri}>%{DATA:program}: %{GREEDYDATA:syslog_message}" }
            add_field => [ "received_at", "%{@timestamp}" ]
        }
    }

    if [prog] =~ /^ddns$/ {
        grok {
            match => { "message" => "<%{PROG:syslog_pri}>%{DATA:program}\[%{INT:pid}\]: %{GREEDYDATA:syslog_message}" }
            add_field => [ "received_at", "%{@timestamp}" ]
        }
    }

    syslog_pri { }

    date {
        match => [ "syslog_timestamp", "yyyy:MM:dd-HH:mm:ss" ]
    }

    mutate {
        replace => [ "@source_host", "sflne01.sarandasnet.local" ]
        replace => [ "@message", "%{syslog_message}" ]
        remove_field  => [ "syslog_message", "syslog_timestamp" ]
    }

    kv {
        source => "@message"
    }

    geoip {
        source => "SRC"
        target => "geoip"
        database => "/etc/logstash/GeoLiteCity.dat"
        add_field => [ "[geoip][coordinates]", "%{[geoip][longitude]}" ]
        add_field => [ "[geoip][coordinates]", "%{[geoip][latitude]}"  ]
    }

    mutate {
        convert => [ "[geoip][coordinates]", "float"]
    }
}
################
#  END IPFIRE  #
################
}

1 个答案:

答案 0 :(得分:1)

我使用这个进行了有条件的工作:

if [message] =~ /ddns/

我认为您必须使用/而不是",以便将ddns用作正则表达式。

/^ddns$/出现错误:字符串开头的^锚点和结尾的$。所以这个正则表达式唯一匹配的是ddns。如果您希望正则表达式在字符串

中的任何位置匹配ddns,则必须同时删除这两者