Как мне красиво распечатать JSON для тела электронной почты в logstash?

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

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

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

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>
"
        }
    }
}

person leedm777    schedule 18.08.2015    source источник
comment
Плагин json_encode изменяет свой парсер JSON, и необходимо добавить красивую печать назад.   -  person approxiblue    schedule 24.08.2015


Ответы (1)


Как сказал приблизительно, эта проблема вызвана logstash новый парсер JSON (JrJackson). В качестве обходной путь, пока снова не будет добавлена ​​поддержка красивой печати. Вот как:

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

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

Изменить строку 5

require "logstash/json" 

в

require "json" 

И измените строку 44

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

в

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

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

Дополнение:

Если вам не нравится менять источники Ruby, вы также можете использовать фильтр ruby ​​вместо json_encode:

# encode the message, but pretty this time
ruby  {
    init => "require 'json'"
    code => "event['body'] = JSON.pretty_generate(event['body'])"
}
person hurb    schedule 25.08.2015
comment
Встроенный рубин - это почти то, что я искал. Было бы неплохо использовать существующий фильтр или как-то использовать кодек. Но две строчки Ruby - это совсем не плохо! - person leedm777; 26.08.2015