2015-08-18 1 views
3

У меня есть конфигурация Logstash, которую я использовал для пересылки сообщений журнала в сообщениях электронной почты. Он использует json и json_encode для анализа и повторного кодирования сообщений журнала JSON.Как я могу печатать JSON для тела электронной почты в logstash?

json_encode используется для красивой печати JSON, которая предназначена для очень приятных писем. К сожалению, с недавними обновлениями в Logstash это уже не очень печатает.

Есть ли способ получить красивую форму события в поле, которое я могу использовать для тел электронной почты? Я в порядке с JSON, Ruby debug или большинством других читаемых пользователем форматов.

filter { 
    if [type] == "bunyan" { 
     # Save a copy of the message, in case we need to pretty-print later 
     mutate { 
      add_field => { "@orig_message" => "%{message}" } 
     } 

     json { 
      source => "message" 
      add_tag => "json" 
     } 
    } 

    // other filters that might add an "email" tag 

    if "email" in [tags] { 
     # pretty-print JSON for the email 
     if "json" in [tags] { 
      # re-parse the message into a field we can encode 
      json { 
       source => "@orig_message" 
       target => "body" 
      } 

      # encode the message, but pretty this time 
      json_encode { 
       source => "body" 
       target => "body" 
      } 
     } 

     # escape the body for HTML output 
     mutate { 
      add_field => { htmlbody => "%{body}" } 
     } 
     mutate { 
      gsub => [ 
       'htmlbody', '&', '&', 
       'htmlbody', '<', '&lt;' 
      ] 
     } 
    } 
} 

output { 
    if "email" in [tags] and "throttled" not in [tags] { 
     email { 
      options => { 
       # config stuff... 
      } 
      body => "%{body}" 
      htmlbody => " 
<table> 
    <tr><td>host:</td><td>%{host}</td></tr> 
    <tr><td>when:</td><td>%{@timestamp}</td></tr> 
</table> 
<pre>%{htmlbody}</pre> 
" 
     } 
    } 
} 
+0

json_encode плагин изменяет JSON парсер, и [ довольно-печатная версия должна быть добавлена ​​назад] (https://github.com/logstash-plugins/logstash-filter-json_encode/issues/3). – approxiblue

ответ

1

По словам approxiblue, эта проблема вызвана logstash в new JSON parser (JrJackson). Вы можете использовать old parser в качестве обходного пути до тех пор, пока не будет снова добавлена ​​поддержка печати. Вот как это делается:

Вам нужно изменить две строки рубинового файла плагина. Путь должен быть что-то вроде:

LS_HOME/vendor/bundle/jruby/1.9/gems/logstash-filter-json_encode-0.1.5/lib/logstash/filters/json_encode.rb 

Изменение линии

require "logstash/json" 

в

require "json" 

И изменение линии

event[@target] = LogStash::Json.dump(event[@source]) 

в

event[@target] = JSON.pretty_generate(event[@source]) 

Это все. После перезапуска логсташа нужно снова распечатать.

Дополнение:

В случае, если вы не любите изменения ваши источники рубин вы можете также использовать рубиновый фильтр вместо json_encode:

# encode the message, but pretty this time 
ruby { 
    init => "require 'json'" 
    code => "event['body'] = JSON.pretty_generate(event['body'])" 
} 
+0

Inline ruby ​​- это почти то, что я искал. Было бы неплохо использовать существующий фильтр или каким-то образом использовать кодек. Но две строки Ruby неплохие! – leedm777

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