2016-08-19 111 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