Logstash 5中的漂亮JSON文档

时间:2017-03-21 11:59:25

标签: json ruby logstash

我使用Logstash 5来摄取包含一组JSON文档的文件,在每个事件中提取每个文档的一部分,然后将它们写入另一个文件。

我想打印输出JSON。我发现这个线程:How do I pretty-print JSON for an email body in logstash?看起来很理想,但Logstash 5现在阻止你直接访问事件属性,用event.get和event.set方法替换它(见https://www.elastic.co/guide/en/logstash/current/event-api.html)。

我尝试按如下方式转换上述内容:

ruby  {
    init => "require 'json'"
    code => "@pretty_body = JSON.pretty_generate(event.get('body'))
             event.set('body', @pretty_body)
            "
}

但是

ERROR logstash.filters.ruby - Ruby exception occurred: only generation of JSON objects or arrays allowed

上述LS5的正确值是什么?

2 个答案:

答案 0 :(得分:2)

我认为您正在寻找以下内容:

filter {
  ruby  {
    init => "require 'json'"
    code => "event.set('message', JSON.pretty_generate(JSON.parse(event.get('message'))))"
  }
}

这是我的测试和结果:

input: {"make_me_pretty":"test"}
{
    "@timestamp" => 2017-03-22T04:56:00.118Z,
      "@version" => "1",
       "message" => "{\n  \"make_me_pretty\": \"test\"\n}"
}

答案 1 :(得分:0)

谢谢@fylie!我发布这个作为另一个答案,因为我需要调整我正在做的事情。

我的问题是输入文档是包含在另一个JSON文档中的JSON文档,因此内部文档是外部doc中的一个字段,其中包含元数据。所以“消息”包含的内容超过了我想要写入文件的内容。

我试图通过使用json过滤器将内部doc字段解析到顶层,删除所有其他内容,然后漂亮打印剩余的内容,试图将文档简化为我想要的内容。所以我在Ruby过滤器中没有任何东西可用。

为了解决这个问题,我保留了所有内容,不使用json过滤器解析内部doc字段,而是使用ruby过滤器将其打印出来,然后使用{format =>输出到该文件中。

命令文件输出插件中的%{fieldname}}选项