2016-08-19 73 views
0

我试图匹配我的条件筛选器中的一个子字符串,但它似乎不工作。Logstash条件不匹配

我有一个日志是这样的:

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

您的字段程序中包含什么内容?您是否使用日志的值创建了该字段?如果不是,那么该字段不存在,条件将始终为假。 – baudsp

+0

此外,它不是在你的问题,但你的grok过滤器有一个问题,'['和']'必须用\像这样转义:'\ ['和'\]' – baudsp

+0

@baudsp我已经添加完整配置。我只关心ddns部分,其余部分工作。 – rhillhouse

回答

1

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

if [message] =~ /ddns/ 

我认为你必须使用/代替"使ddns作为一个正则表达式。

/^ddns$/错误:^锚定在字符串的开头,$结束。所以这个正则表达式唯一匹配的是ddns。如果您希望正则表达式匹配ddns字符串中的任意位置,您必须将其移除

+0

这不适合我。我得到以下输出: '{' '“message”=>“<30> ddns [21535]:动态DNS更新为xxx' “,' '”@timestamp“=>”2016-08-19T11:15:19.419Z“,” '“host”=>“sflsv006.sarandasnet.local”' '}' 它也不会创建这些字段,例如'program'或'pid'。 – rhillhouse

+0

@ou_snaaksie哪个字段与'/ ddns /'比较?如果它是'prog',它是如何初始化的?它应该具有哪些价值? – baudsp