Logstash 1.5迁移至6.8.0:Ruby代码拆分data字段键值对问题求助
解决Logstash 6.8.0中拆分data数组内键值对的问题
嘿,我一眼就看出问题所在啦!你当前的代码没法正常工作,核心原因是你的data字段是数组类型,而不是直接的哈希对象。看你的日志示例:
{"data":[{"key1":"value1","key2":"value2","key3":"value3"}]}
这里data的值是一个包含单个哈希的数组,而你之前写的代码直接对event.get('data')做each遍历,其实遍历的是数组里的元素(也就是那个哈希),但你需要先把数组里的哈希取出来再处理。
修正后的Ruby代码
直接用这段代码替换你原来的配置:
ruby { code => " # 获取data字段的数组值 data_array = event.get('data') # 先做安全校验:确保是数组且不为空 if data_array.is_a?(Array) && !data_array.empty? # 取出数组里的第一个哈希对象 data_hash = data_array.first # 遍历哈希的键值对,添加到event中 data_hash.each {|k, v| event.set(k, v) } # 删除原data字段 event.remove('data') end " }
代码说明
- 先做了安全判断:避免因为
data不是数组或者为空导致报错 - 针对你的日志结构,取出数组的第一个元素(也就是存储键值对的哈希)
- 遍历哈希的每个键值对,用
event.set(k, v)把它们添加到顶层事件中 - 最后移除原来的
data字段
扩展说明
如果你的data数组里可能包含多个哈希对象,你可以根据业务需求调整:
- 如果需要把所有哈希的键值对都合并到顶层,要注意键名重复会覆盖的问题
- 如果需要保留数组结构,只是展开每个元素,可以考虑用
split过滤器或者其他方式处理
内容的提问来源于stack exchange,提问作者Santhosh Kumar
相关产品推荐
相关产品推荐

