如何在Logstash中批量替换JSON所有键名中的点(非Ruby插件)
解决Logstash JSON键名含英文点的替换方案(无需自定义Ruby插件)
不用专门编写Ruby插件,有两个现成的实用方案可以解决这个问题:
1. 使用mutate过滤器内嵌Ruby脚本
Logstash的mutate过滤器支持内嵌Ruby代码,你可以直接在配置里写几行脚本,遍历所有字段批量替换键名里的英文点——这种方式不用额外开发插件,上手很方便。
处理顶层字段的示例配置:
filter { mutate { ruby => " new_event = LogStash::Event.new event.to_hash.each do |key, value| new_key = key.gsub('.', '_') # 把点替换成下划线,你可以改成任意需要的字符串 new_event.set(new_key, value) end event.overwrite(new_event) " } }
如果你的JSON存在嵌套结构,需要处理深层字段的键名,可以用递归逻辑修改脚本:
filter { mutate { ruby => " def rename_keys(hash, replacement) hash.each_with_object({}) do |(k, v), new_hash| new_k = k.gsub('.', replacement) new_hash[new_k] = v.is_a?(Hash) ? rename_keys(v, replacement) : v end end new_data = rename_keys(event.to_hash, '_') event.overwrite(LogStash::Event.new(new_data)) " } }
2. 使用社区插件logstash-filter-de_dot
这是官方社区专门为解决键名含点问题开发的插件,功能更完善,支持一键处理嵌套字段、自定义替换字符,不用自己写脚本。
安装插件:
在Logstash安装目录下执行命令:
bin/logstash-plugin install logstash-filter-de_dot
示例配置:
filter { de_dot { separator => "_" # 指定替换点的字符,默认就是下划线 nested => true # 开启嵌套字段的自动处理 } }
配置好后,插件会自动遍历所有层级的字段,把键名里的.替换成你指定的字符,省心又高效。
内容的提问来源于stack exchange,提问作者ChikChak
相关产品推荐
相关产品推荐

