Je me connecte à logstash, au format json, mes journaux ont les champs suivants, chaque champ est une chaîne et le champ atts
est un json stringifié (remarque: atts
les sous-champs sont différents à chaque fois )
voici un exemple:
{"name":"bob","last":"builder", "atts":"{\"a\":111, \"b\":222}"}
Je voudrais l'analyser en quelque chose comme ceci:
{
"name" => "bob",
"last" => "builder"
"atss" => {
"a" => 111,
"b" => 222}
}
voici ma configuration:
input { stdin { } }
filter {
json {
source => "message"
target => "parsed"
}
}
output { stdout { codec => rubydebug }}
ok, maintenant je reçois ceci:
{
"@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"
}
comment puis-je analyser le champ atts
en json pour que je reçoive:
{
"@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"
}
grâce à @Alcanzar voici ce que j'ai fait
input {
stdin { }
}
filter {
json {
source => "message"
target => "message"
}
json {
source => "[message][atts]"
target => "[message][atts]"
}
}
output { stdout { codec => rubydebug }}
Il existe un filtre json
. Passez-lui simplement le champ que vous souhaitez analyser et une cible où vous le souhaitez.
Quelque chose comme:
json {
source => "[parsed][atss]"
target => "[parsed][newfield]"
}
Je ne sais pas si vous pouvez mettre atss comme nouveau champ. Cela pourrait ou non fonctionner. Si ce n'est pas le cas, utilisez le filtre mutate
pour remove_field
et rename_field
.