【问题标题】:How to extract values within square brackets fields in a json log如何在json日志中的方括号字段中提取值
【发布时间】:2026-02-09 17:55:02
【问题描述】:

我是使用 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。

提前致谢!

【问题讨论】:

    标签: json syntax logstash brackets square


    【解决方案1】:

    假设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​​ 过滤器或类似的东西。如果您需要吐出多个元素,则需要使用此处 cmets 中讨论的策略:https://*.com/a/45493411/2785358

    【讨论】:

    • 感谢 Alcanzar 的回复,奇怪的是它不起作用。当我使用标准输出查看输出时,我将数组的 [0],[1] 可视化,但即使使用格式 [f​​ield1][0][sub_field] 它也没有给我信息。任何提示可能是什么?
    • 它适用于我 - 将更新更多答案
    • 我的日志有100行左右,不知道发在这里有没有帮助。
    • 像我展示的那样把它减少到最小的可能配置——输入一行,创建一个测试配置文件,然后查看结果并调整。
    • 嗨 Alcanzar,很抱歉这个愚蠢的问题,但是当我配置我的 test.conf 并执行命令时:cat /usr/share/logstash/test.json | bin/logstash -f /etc/logstash/conf.d/test.conf 它停止在:[INFO] 2020-02-17 15:30:42.194 [Api Webserver] 代理 - 成功启动 Logstash API 端点 {:port= >9601} [INFO] 2020-02-17 15:30:42.538 [LogStash::Runner] runner - Logstash 关闭。并且不显示输出,知道为什么会发生吗?