Разбор вложенной строки JSON в Logstash

я регистрируюсь в logstash в формате json, мои журналы имеют следующие поля, каждое поле представляет собой строку и atts поле является строковым json (Примечание:atts sub поля различны каждый раз)

вот пример:

{"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  }}

ok, Итак, теперь я понимаю:

{
    "@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"
}

2 ответов


благодаря @Alcanzar вот что я сделал

input { 
  stdin { } 
}  

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

}
 output { stdout { codec => rubydebug  }}

есть json фильтр. Просто передайте ему поле, которое вы хотите разобрать, и цель, где вы хотите.

что-то типа:

json {
  source => "[parsed][atss]"
  target => "[parsed][newfield]"
}

Я не уверен, что вы можете поставить atss как новое поле. Это может сработать, а может и нет. Если это не так, используйте mutate фильтр remove_field и rename_field.