我的应用将日志作为json写入stdout。应用程序在docker中运行。而docker也以json格式记录stdout。所以我有一个json嵌套在json中。这是一个例子:
{"log":"{\"message\":\"Something failed\",\"thread_name\":\"http-nio-8080-exec-1\",\"level\":\"WARN\",\"level_value\":30000,\"test-mdc\":\"test-mdc-value\",\"appname\":\"myWebservice\"}\n","stream":"stdout","time":"2017-11-30T14:44:19.514Z"}
我想删除我的应用程序的日志并将所有字段移到顶层。感谢这个答案Parsing nested JSON string in Logstash我设法解析了所有jsons(虽然我不能理解这个配置中的任何内容),但我的应用程序日志仍然不在顶层。这是我得到的:
{
"@version" => "1",
"host" => "4c11913cddf3",
"@timestamp" => 2017-12-01T07:50:16.562Z,
"message" => {
"test-mdc" => "test-mdc-value",
"appname" => "myWebservice",
"level" => "WARN",
"thread_name" => "http-nio-8080-exec-1",
"level_value" => 30000,
"message" => "Something failed"
}
}
我的配置:
input { stdin { } }
filter {
json {
source => "message"
target => "message"
}
json {
source => "[message][log]"
target => "[message]"
}
}
output { stdout { codec => rubydebug } }
如果有重复项,我可以将所有嵌套字段移到顶层覆盖重复项吗?没有红宝石更好,因为我不知道。
答案 0 :(得分:0)
回答我自己的问题。您需要删除target => "[message]"
。虽然我仍然不完全了解这里发生的事情,但配置应如下所示:
input { stdin { } }
filter {
json {
source => "message"
target => "message"
}
json {
source => "[message][log]"
}
}
output { stdout { codec => rubydebug } }