Fluentd 中如何使用条件语句(按内容分流/处理)?
Fluentd 没有 if-else 语法,条件逻辑通过 rewrite_tag_filter 按字段值改写 tag 分流,或用 grep 过滤器按正则筛选,也可用 record_transformer 的 Ruby 表达式做条件赋值。本文给出三种实现。
Fluentd 配置是声明式的,没有 if-else——条件逻辑靠三招实现:grep 过滤器按正则筛选、rewrite_tag_filter 按字段值改写 tag 路由、record_transformer 里写 Ruby 三元表达式。
方法一:rewrite_tag_filter 条件分流(最常用)
<match app.**>
@type rewrite_tag_filter
<rule>
key level
pattern ^(ERROR|FATAL)$
tag alert.${tag}
</rule>
<rule>
key level
pattern ^DEBUG$
tag drop.${tag}
</rule>
</match>
<match alert.**>
@type forward ... # 错误日志走告警链路
</match>
<match drop.**>
@type null # DEBUG 直接丢弃
</match>
方法二:grep 过滤器只留符合条件的
<filter app.**>
@type grep
<regexp>
key status
pattern ^5\d\d$
</regexp>
</filter>
只有 status 为 5xx 的日志继续往后走,其余丢弃。反向排除用 <exclude>。
方法三:Ruby 表达式条件赋值
<filter app.**>
@type record_transformer
<record>
severity ${record["status"].to_i >= 500 ? "critical" : "normal"}
</record>
</filter>
观测云对照
观测云 DataKit Pipeline 的条件逻辑更直观:if status == 500 { ... } 原生命令式写法,配合 drop_key/cover/replace 等函数完成筛选、脱敏、改写。
常见问题(FAQ)
Q:能组合多个条件(AND/OR)吗? grep 的多个 regexp 是 AND;rewrite_tag_filter 的多个 rule 按序命中即走,组合出 OR 语义。
Q:条件判断影响性能吗? 正则越多越慢;高吞吐场景把最常见分支的规则放前面。