Fluentd 中如何使用条件语句(按内容分流/处理)?

Fluentd 没有 if-else 语法,条件逻辑通过 rewrite_tag_filter 按字段值改写 tag 分流,或用 grep 过滤器按正则筛选,也可用 record_transformer 的 Ruby 表达式做条件赋值。本文给出三种实现。

最佳实践
Fluentd 中如何使用条件语句(按内容分流/处理)?封面

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:条件判断影响性能吗? 正则越多越慢;高吞吐场景把最常见分支的规则放前面。

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

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

立即开始

选择观测云版本

代码托管平台