我以json格式登录logstash,
我的日志有以下字段,每个字段都是一个字符串,atts
字段是字符串化的json(注意:atts
子字段每次都不同)
这是一个例子:
{"name":"bob","last":"builder", "atts":"{\"a\":111, \"b\":222}"}
我想把它解析成这样的东西:
{
"name" => "bob",
"last" => "builder"
"atss" => {
"a" => 111,
"b" => 222}
}
这是我的配置:
input { stdin { } }
filter {
json {
source => "message"
target => "parsed"
}
}
output { stdout { codec => rubydebug }}
确定, 所以现在我明白了:
{
"@timestamp" => 2017-04-05T12:19:04.090Z,
"parsed" => {
"atss" => "{\"a\":111, \"b\":222}",
"name" => "bob",
"last" => "the builder"
},
"@version" => "1",
"host" => "0.0.0.0"
}
如何将atts
字段解析为json,以便我收到:
{
"@timestamp" => 2017-04-05T12:19:04.090Z,
"parsed" => {
"atss" =>
{"a" => 111,
"b" => 222},
"name" => "bob",
"last" => "the builder"
},
"@version" => "1",
"host" => "0.0.0.0"
}
答案 0 :(得分:17)
感谢@Alcanzar这就是我做的事情
input {
stdin { }
}
filter {
json {
source => "message"
target => "message"
}
json {
source => "[message][atts]"
target => "[message][atts]"
}
}
output { stdout { codec => rubydebug }}
答案 1 :(得分:4)
有一个json
过滤器。只需将要解析的字段和目标传递给它。
类似的东西:
json {
source => "[parsed][atss]"
target => "[parsed][newfield]"
}
我不确定你是否可以将atss作为新领域。它可能会也可能不会奏效。如果不是,请使用mutate
过滤器remove_field
和rename_field
。
答案 2 :(得分:0)
截至2020年8月5日,在logstash 7.8.0中,JSON过滤器现在解析嵌套的字符串。
我将以下字符串存储在Postgres列中,我们称之为“ column-1”
{ "XYZ" : {"A" : "B", "C" : "D", "E" : "F"} }
我的json过滤器看起来像这样
json {
source => "column-1"
target => "column-1"
}
它在我的Elasticsearch Index中被解析为嵌套字典
与接受的答案的区别在于,现在我们只需要一个json过滤器即可,而不是多个。