You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Logstash中修改JSON对象列表字段名且保留列表结构

解决Logstash中无需拆分JSON数组即可重命名字段的问题

不用拆分JSON数组,直接用ruby filter就能实现批量修改数组内对象的字段名,完整配置如下:

input {
  stdin {} # 示例输入,可替换为你的实际输入源
}

filter {
  # 先把输入的JSON字符串解析成数组
  json {
    source => "message"
    target => "data_array" # 把解析后的数组存到data_array字段,避免覆盖原message
  }

  # 用ruby遍历数组,修改每个对象的字段名
  ruby {
    code => '
      array = event.get("data_array")
      if array.is_a?(Array)
        array.each do |item|
          if item.is_a?(Hash) && item.key?("b")
            item["c"] = item.delete("b")
          end
        end
        event.set("data_array", array)
      end
    '
  }

  # 可选:如果需要把修改后的数组转回JSON字符串输出
  mutate {
    remove_field => ["message"] # 删除原输入的message字段
  }
}

output {
  stdout {
    codec => rubydebug # 用rubydebug格式查看结果,也可替换为json codec输出JSON字符串
  }
}

配置说明:

  1. json filter:将输入的JSON数组字符串解析成Logstash可操作的数组对象,存到data_array字段(避免覆盖原message)。
  2. ruby filter:
    • 取出数组字段,判断是否为数组类型
    • 遍历数组中的每个对象,检查是否包含b字段
    • 把b字段的值转移到c字段,同时删除原b字段
    • 把修改后的数组重新设置回data_array字段
  3. output:用rubydebug可以直观看到处理后的结构,如果需要输出JSON字符串,把codec改成json即可。

效果验证:

输入:

[{"a": 1, "b": 2}, {"a": 14, "b": 65}]

处理后输出的data_array字段内容:

data_array => [
    [0] {
        "a" => 1,
        "c" => 2
    },
    [1] {
        "a" => 14,
        "c" => 65
    }
]

如果需要输出JSON数组字符串,调整output为:

output {
  stdout {
    codec => json_lines
  }
}

就能得到期望的输出:

{"data_array":[{"a":1,"c":2},{"a":14,"c":65}]}

内容的提问来源于stack exchange,提问作者entertotheclub

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 06:54:59