如何修改 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
enable_ruby true
auto_typecast true
# 仅删除顶层敏感字段,不清理嵌套副本或原始字符串
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 里的指令)。
常见问题(FAQ)
Q:改了字段类型会变吗? auto_typecast true 可在值仅含单个 placeholder 时保留其类型;并不要求 enable_ruby false。本文嵌套访问和 strip 表达式需 enable_ruby true,字段缺失/类型不符还需自行防护。
Q:能按条件改吗? 启用 enable_ruby true 后,<record> 里可以写 Ruby 三元表达式:level_name ${record["status"].to_i >= 500 ? "error" : "ok"}。