Fluentd 如何给日志事件添加标签(Tag/字段)?
Fluentd 给日志添加字段的三种方式:record_transformer 插件加静态字段或主机名、rewrite_tag_filter 改写 tag 路由、以及 filter 中条件添加。本文给出完整配置示例。
最常用的是 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>
tag 被改写成 error.app.xxx,后续 <match error.**> 接管路由。
方法三:采集侧直接带标签
in_tail 配置中的 tag app.*** 本身就按路径给事件打上了 tag,是最上游的"标签"。
观测云对照
观测云 DataKit 采集日志时支持在采集器配置中直接附加自定义 tags,与日志一同上报;Pipeline 里还能用 add_key() 按条件动态加字段,语法比 Fluentd 插件链更直观。
常见问题(FAQ)
Q:tag 和字段(field)是一回事吗? 不是。tag 是 Fluentd 内部路由标识,不写入输出;字段是日志记录的一部分。本文两种都覆盖。
Q:能加当前时间字段吗? 可以,${Time.at(time).utc.strftime(...)} Ruby 表达式搞定。