Fluentd 如何给日志事件添加标签(Tag/字段)?
Fluentd 日志字段与路由标签配置:record_transformer 添加字段、rewrite_tag_filter 改写 tag 路由,以及采集侧设置 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")}。