如何在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字符串 } }
配置说明:
- json filter:将输入的JSON数组字符串解析成Logstash可操作的数组对象,存到
data_array字段(避免覆盖原message)。 - ruby filter:
- 取出数组字段,判断是否为数组类型
- 遍历数组中的每个对象,检查是否包含
b字段 - 把
b字段的值转移到c字段,同时删除原b字段 - 把修改后的数组重新设置回
data_array字段
- 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
相关产品推荐
相关产品推荐

