首页 > 解决方案 > 如何在json日志中的方括号字段中提取值

问题描述

我是使用 logstash 的新手,我需要以下 json 日志格式的帮助:

{
"field1" :[
{
"sub_field1": {
"sub_field2":"value X"
"sub_field3": {"sub_field4":"value Y"}

}
"sub_field5":"value W"
}
]
}

我想知道如何使用 mutate:“Add_field”来获取值 X、值 Y 和值 W。

提前致谢!

标签: jsonsyntaxlogstashbracketssquare

解决方案


假设您在 下只有一个数组元素field1,那就是:

add_field => {
  sub_field1 => '%{[field1][0][sub_field1]}'
  sub_field2 => '%{[field1][0][sub_field1][sub_field2]}'
...
}

一个很好的测试方法——创建一个名为test.json

{ "field1" :[ { "sub_field1": { "sub_field2":"value X","sub_field3": {"sub_field4":"value Y"} }, "sub_field5":"value W" } ] }

创建一个配置文件,如test.conf

{
    stdin { codec => 'json_lines' }
}
filter {
    mutate {
        add_field => {
            sub_field1 => '%{[field1][0][sub_field1]}'
            sub_field2 => '%{[field1][0][sub_field1][sub_field2]}'
        }
    }
}

output {
    stdout { codec => "rubydebug" }
}

然后运行它:cat test.json | bin/logstash -f test.conf

你会得到这样的输出:

{
        "field1" => [
        [0] {
            "sub_field5" => "value W",
            "sub_field1" => {
                "sub_field3" => {
                    "sub_field4" => "value Y"
                },
                "sub_field2" => "value X"
            }
        }
    ],
    "@timestamp" => 2020-02-17T17:26:59.471Z,
      "@version" => "1",
          "host" => "xxxxxxxx",
    "sub_field2" => "value X",
    "sub_field1" => "{\"sub_field3\":{\"sub_field4\":\"value Y\"},\"sub_field2\":\"value X\"}",
          "tags" => []
}

其中显示sub_field2sub_field1

如果您无法预测字段名称,那么您将需要使用 ruby​​ 过滤器或类似的东西。如果您需要吐出多个元素,则需要使用此处评论中讨论的策略:https ://stackoverflow.com/a/45493411/2785358


推荐阅读