如何修改 Fluentd 的 JSON 输出格式?
修改 Fluentd JSON 输出用 record_transformer 过滤器:record 块中加字段、改字段、删字段(脱敏),输出段可再配 format json 控制序列化。本文给出增删改完整示例。
在 filter 中用 record_transformer:<record> 块里写键值对即增改字段,remove_keys 删除字段——日志在输出前被就地改造,输出的 JSON 格式由你完全控制。
完整示例
<source>
@type tail
path /var/log/app.log
tag app.logs
<parse>
@type json
</parse>
</source>
<filter app.logs>
@type record_transformer
remove_keys password,token # 删除敏感字段
<record>
hostname "#{Socket.gethostname}" # 加主机名
environment production # 加静态字段
user_id ${record["user"]["id"]} # 嵌套字段提到顶层
message ${record["message"].strip} # Ruby 表达式处理值
</record>
</filter>
<match app.logs>
@type file
path /var/log/processed/app.log
<format>
@type json
</format>
</match>
三个高频需求
- 加字段:直接写
key value; - 改/提字段:
${record["a"]["b"]}访问嵌套值后赋给新键; - 删字段:
remove_keys key1,key2(注意是参数不是 record 里的指令)。
观测云对照
观测云 DataKit Pipeline 用 add_key()、rename()、drop_key()、replace() 等函数完成同样的改造,脚本在控制台在线调试、实时预览输出 JSON。
常见问题(FAQ)
Q:改了字段类型会变吗? record_transformer 的值默认是字符串;保持原类型用 enable_ruby false 配合 auto_typecast,或在输出端用插件处理。
Q:能按条件改吗? <record> 里可以写 Ruby 三元表达式:level_name ${record["status"].to_i >= 500 ? "error" : "ok"}。