2016-08-19 6 views
0

Im пытается совместить подстроку в моем условном фильтре, но, похоже, она не работает.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$/, но без успеха.

ОБНОВЛЕНО CONFIG:

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 имеет проблему, '' '' и ']' должен быть экранирован с помощью \ like this: '\ [' and '\]' – baudsp

+0

@baudsp Я добавил полный конфигурации. Меня просто беспокоит часть ddns, а остальные работают. – rhillhouse

ответ

1

Я сделал условную работу с помощью этого:

if [message] =~ /ddns/ 

Я думаю, что вы должны использовать / вместо " так, что ddns используется как регулярное выражение.

Ошибка: /^ddns$/: Антенны ^ в начале строки и $ в конце. Итак, единственное, что будет соответствовать этому регулярному выражению, - ddns. Вам нужно будет удалить оба, если вы хотите, чтобы regex соответствовал ddns в любом месте строки

+0

Это не подходит для меня. Я получаю следующий вывод: '{' '" message "=>" <30> ddns [21535]: динамическое обновление DNS для xxx' '(Duck DNS) успешно", ' ' '@version" => "1 ",' '' @timestamp "=>" 2016-08-19T11: 15: 19.419Z ",' '" host "=>" sflsv006.sarandasnet.local "' '}' Он также не создает поля, такие как 'program' или' pid'. – rhillhouse

+0

@ou_snaaksie какое поле вы сравниваете с '/ ddns /'? Если это 'prog', как он инициализируется? И какую ценность он должен иметь? – baudsp