在Logstash

时间:2017-04-05 13:29:38

标签: logstash

我以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"
}

3 个答案:

答案 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_fieldrename_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过滤器即可,而不是多个。