2017-02-15 16 views
0

средыLogstash Фильтрация и Синтаксический Dies Выходной

  • Ubuntu 16,04
  • Logstash 5.2.1
  • ElasticSearch 5,1

Я настроил нашу платформу DEIS для отправки логов на наш Узел Logstack без проблем. Тем не менее, я все еще новичок в Ruby, а Regexes - не мой сильный костюм.

Пример журнала:

2017-02-15T14:55:24UTC deis-logspout[1]: 2017/02/15 14:55:24 routing all to udp://x.x.x.x:xxxx\n 

Конфигурация Logstash:

input { 
    tcp { 
     port => 5000 
     type => syslog 
     codec => plain 
    } 
    udp { 
     port => 5000 
     type => syslog 
     codec => plain 
    } 
} 

filter { 
    json { 
     source => "syslog_message" 
    } 
} 

output { 
    elasticsearch { hosts => ["foo.somehost"] } 
} 

Elasticsearch выход:

"@timestamp" => 2017-02-15T14:55:24.408Z, 
"@version" => "1", 
"host" => "x.x.x.x", 
"message" => "2017-02-15T14:55:24UTC deis-logspout[1]: 2017/02/15 14:55:24 routing all to udp://x.x.x.x:xxxx\n", 
"type" => "json" 

Желаемый результат:

"@timestamp" => 2017-02-15T14:55:24.408Z, 
"@version" => "1", 
"host" => "x.x.x.x", 
"type" => "json" 
"container" => "deis-logspout" 
"severity level" => "Info" 
"message" => "routing all to udp://x.x.x.x:xxxx\n" 

Как я могу извлечь информацию из сообщения в своих отдельных областях?

+0

Вы имеете в виду, добывающие ваше сообщение * * в четырех различных * поля * (части, как вы упомянули)? Вы сделали это уже, как я вижу из вывода ES ** ** выше. Так в чем ваш вопрос? Что касается подхода? – Kulasangar

+0

Извините, если это было не кратким, я обновил вопрос. – user7565843

ответ

0

К сожалению, ваши предположения о том, что вы пытаетесь сделать, слегка отключаются, но мы можем это исправить!

Вы создали регулярное выражение для JSON, но вы не разбираете JSON. Вы просто разбираете журнал, который является bastardized syslog (см. SyslogStreamer в source), но на самом деле это не формат syslog (либо RFC 5424, либо 3164). После этого Logstash предоставляет выход JSON.

Давайте разложим сообщение, которое станет источником, который вы анализируете. Ключ вам нужно разобрать фронт сообщения назад.

Сообщение:

2017-02-15T14:55:24UTC deis-logspout[1]: 2017/02/15 14:55:24 routing all to udp://x.x.x.x:xxxx\n 
  • 2017-02-15T14:55:24UTC: Отметка общая картина Grok. Это в основном следует TIMESTAMP_ISO8601, но не совсем.
  • deis-logspout[1]: Это будет ваш источник logs, который вы можете назвать контейнером. Вы можете использовать шаблон grok URIHOST.
  • routing all to udp://x.x.x.x:xxxx\n: Поскольку сообщение для большинства журналов содержится в конце этого сообщения, вы можете просто затем использовать шаблон ГРОК GREEDYDATA, который является эквивалентом .* в регулярном выражении.
  • 2017/02/15 14:55:24: Еще одна временная метка (почему?), Которая не соответствует общим шаблонам grok.

С помощью фильтров grok вы можете сопоставить синтаксис (абстракция от регулярных выражений) к семантическому (имя для извлекаемого значения).Например, %{URIHOST:container}

Вы увидите, что я сделал несколько взломов фильтров grok, чтобы сделать форматирование. У вас есть соответствующие части текста, даже если вы не намерены фиксировать результаты. Если вы не можете изменить форматирование временных меток в соответствии со стандартами, создайте собственный шаблон.

Конфигурация:

input { 
    tcp { 
     port => 5000 
     type => deis 
    } 
    udp { 
     port => 5000 
     type => deis 
    } 
} 

filter { 
    grok { 
     match => { "message" => "%{TIMESTAMP_ISO8601:timestamp}(UTC|CST|EST|PST) %{URIHOST:container}\[%{NUMBER}\]: %{YEAR}/%{MONTHNUM}/%{MONTHDAY} %{TIME} %{GREEDYDATA:msg}" } 
    } 
} 

output { 
    elasticsearch { hosts => ["foo.somehost"] } 
} 

Выход:

{ 
    "container" => "deis-logspout", 
    "msg" => "routing all to udp://x.x.x.x:xxxx", 
    "@timestamp" => 2017-02-22T23:55:28.319Z, 
    "port" => 62886, 
    "@version" => "1", 
    "host" => "10.0.2.2", 
    "message" => "2017-02-15T14:55:24UTC deis-logspout[1]: 2017/02/15 14:55:24 routing all to udp://x.x.x.x:xxxx", 
    "timestamp" => "2017-02-15T14:55:24" 
    "type" => "deis" 
} 

Вы можете дополнительно мутировать пункт уронить @timestamp, @host и т.д., поскольку они предоставляются Logstash по умолчанию , Другое предложение - использовать date filter для преобразования любых временных меток, найденных в удобные форматы (лучше для поиска).

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

Ресурсы:

+0

Спасибо за совет. Как настроить фильтр Grok для анализа сообщения? – user7565843

+0

Еще раз спасибо Signus, я обновил вышеуказанный вопрос для лучшего контекста. – user7565843

 Смежные вопросы

  • Нет связанных вопросов^_^