2013-11-30 5 views
0

Я хотел бы извлечь слово интерфейса из текста из логсташа.Невозможно использовать add_field в logstash

журнал

Sample - 2013 28 августа 13:14:49 LOGFILE: Интерфейс Etherface1/9 вниз (Transceiver Absent)

Я хочу, чтобы извлечь "Etherface1/9" из-за этого и добавить его в поле называемый интерфейсом.

Я имею следующий файл конф для того же

input 
{ 
     file 
     { 
       type => "syslog" 
       path => [ "/home/vineeth/logstash/mylog.log" ] 
       #path => ["d:/New Folder/sjdc.show.tech/n5k-3a-show-tech.txt"] 
       start_position=>["beginning"] 
     } 
} 
filter { 
    grok { 
    type => "syslog" 
    add_field => [ "port", "Interface %{WORD}" ] 
    } 
} 
output 
{ 
     stdout 
     { 
       debug => true debug_format => "json" 
     } 
     elasticsearch 
     { 
       embedded => true 
     } 
} 

Но тогда я всегда получаю «_grokparsefailure» под тегами и ни один из этих новых полей появляются. Пожалуйста, дайте мне знать, как я могу получить требуемый результат

ответ

1

Фильтр grok ожидает, что вы попытаетесь сопоставить текст. Поскольку вы не проходите никаких возможных совпадений, он вызывает тег _grokparsefailure (за the manual, тег добавляется «когда не было успешного совпадения»).

Вы можете использовать матч как это:

grok { 
    match => ["message", "Interface %{DATA:port} is down"] 
} 

Это еще не завершена, если текст матча нет. Logstash довольно хорош в разборе полей с простой структурой, но данные, встроенные в удобную для пользователя строку, иногда сложны. Обычно вам нужно разветвляться на основе формата сообщения.

Вот очень простой пример, используя conditional с регулярным выражением:

if [message] =~ /Interface .+ is down/ { 
    grok { 
     match => ["message", "Interface %{DATA:port} is down"] 
    } 
}