【问题标题】:Logstash conditional not matchingLogstash 条件不匹配
【发布时间】:2016-08-19 08:08:18
【问题描述】:

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

我有这样的日志:

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

【问题讨论】:

  • 您的现场计划中有什么?您是否使用日志的值创建了该字段?如果不存在,则该字段不存在,条件始终为 false。
  • 另外,这不是你的问题,但你的 grok 过滤器有问题,[] 必须像这样用 \ 转义:\[\]
  • @baudsp 我已经添加了完整的配置。我只关心 ddns 部分,其余部分有效。
  • 谢谢。 prog 应该是什么值?

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


【解决方案1】:

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

if [message] =~ /ddns/

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

/^ddns$/ 存在错误:^ 定位在字符串的开头,$ 定位在结尾。所以这个正则表达式唯一匹配的是ddns。如果您希望正则表达式与字符串中的任何位置匹配 ddns,则必须删除两者

【讨论】:

  • 它不适合我。我得到以下输出:{"message" =&gt; "&lt;30&gt;ddns[21535]: Dynamic DNS update for xxx(Duck DNS) successful","@version" =&gt; "1","@timestamp" =&gt; "2016-08-19T11:15:19.419Z","host" =&gt; "sflsv006.sarandasnet.local"}它也没有创建字段,例如programpid
  • @ou_snaaksie 您将哪个字段与/ddns/ 进行比较?如果是prog,它是如何初始化的?它应该具有哪个值?
猜你喜欢
  • 1970-01-01
  • 2015-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多