我使用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的正确值是什么?
答案 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}}选项