Fluentd 如何给日志事件添加标签(Tag/字段)?

Fluentd 日志字段与路由标签配置:record_transformer 添加字段、rewrite_tag_filter 改写 tag 路由,以及采集侧设置 tag。本文给出完整配置示例。

最佳实践
Fluentd 如何给日志事件添加标签(Tag/字段)?封面

最常用的是 record_transformer 过滤器:在 filter 段里用 <record> 块添加任意键值对——可以加静态字符串、主机名、环境变量,甚至用 Ruby 表达式计算。

方法一:record_transformer 加字段

<filter app.**>
  @type record_transformer
  <record>
    hostname "#{Socket.gethostname}"
    env     production
    tag_part ${tag}
  </record>
</filter>

每条日志都会多出 hostname、env、tag_part 三个字段。

方法二:按条件改写 tag 分流

需要"错误日志打特殊标记走不同输出"时,用 rewrite_tag_filter 插件:

<match app.**>
  @type rewrite_tag_filter
  <rule>
    key     level
    pattern ^ERROR$
    tag     error.${tag}
  </rule>
</match>

匹配 ERROR 的 tag 被改写成 error.app.xxx,后续 <match error.**> 接管路由。未匹配任何规则的记录会被丢弃;若要保留普通日志,可先应用方法一,再增加匹配 tag_part 的兜底规则,改写为 normal.${tag},并配置 <match normal.**> 输出,避免回到 app.** 形成循环。

方法三:采集侧直接带标签

in_tail 配置中的 tag app.* 本身就按路径给事件打上了 tag,是最上游的"标签"。

常见问题(FAQ)

Q:tag 和字段(field)是一回事吗? 不是。tag 是 Fluentd 的路由标识,可随输出协议传递,但不会自动成为记录中的字段;字段是日志记录的一部分。本文两种都覆盖。

Q:能加当前时间字段吗? 可以,在 record_transformer 中开启 enable_ruby true 后,用 ${time.utc.strftime("%Y-%m-%dT%H:%M:%SZ")} 添加事件时间;当前处理时间用 ${Time.now.utc.strftime("%Y-%m-%dT%H:%M:%SZ")}。

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

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

立即开始

选择观测云版本

代码托管平台