logstash 嵌套 json

使用 json 插件,数据输入:

1
{"name":"bob","last":"builder", "atts":"{\"a\":111, \"b\":222}"}

希望得到:

1
2
3
4
5
6
7
8
{
"name": "bob",
"last": "builder",
"atts": {
"a": 111,
"b": 222
}
}

但实际得到:

1
2
3
4
5
{
"name": "bob",
"last": "builder",
"atts": "{\"a\": 111,\"b\": 222}"
}

使用的配置是:

1
2
3
4
5
6
7
8
input { stdin { } }
filter {
json {
source => "message"
target => "message"
}
}
output { stdout { codec => rubydebug }}

如果想让 atts 也是一个对象,而不是字符串,必须使用下面的方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
input { 
stdin { }
}

filter {
json {
source => "message"
target => "message"
}
json {
source => "[message][atts]"
target => "[message][atts]"
}
}

output { stdout { codec => rubydebug }}

如果是动态的变量呢?使用 ruby 代码来把结果放到 res 里面:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
input {  
stdin{}
}

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

output {
stdout { codec => rubydebug }
}

如果想放到顶级,可以用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
input {  
stdin{}
}

filter {
ruby {
code => "
require 'json'
kv=JSON.parse(event.get('message'))
kv.each do |k,v|
event.set(k, v)
end
"
}
}

output {
stdout { codec => rubydebug }
}