如何修改 Fluentd 的 JSON 输出格式?

修改 Fluentd JSON 输出用 record_transformer 过滤器:record 块中加字段、改字段、删字段(脱敏),输出段可再配 format json 控制序列化。本文给出增删改完整示例。

最佳实践
如何修改 Fluentd 的 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>

三个高频需求

  1. 加字段:直接写 key value;
  2. 改/提字段:${record["a"]["b"]} 访问嵌套值后赋给新键;
  3. 删字段: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"}。

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台