web-dev-qa-db-fra.com

Analyse de la chaîne JSON imbriquée dans Logstash

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"
}
12
dina

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  }}
18
dina

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.

4
Alcanzar