如何用Fluent Bit采集K8s中应用的OpenTelemetry格式标准输出日志
解决方案
无需部署OpenTelemetry Collector的方案(推荐,适用于JSON格式OTel日志)
如果你的应用输出到STDOUT的是每行一个完整的JSON序列化OpenTelemetry日志对象,可以直接通过Fluent Bit的tail插件配合自定义解析器完成采集:
- 定义OTel JSON解析器
在Fluent Bit的parsers.conf中添加自定义解析规则,匹配OTel日志的时间字段和结构:
[PARSER] Name otel-json Format json Time_Key time Time_Format %Y-%m-%dT%H:%M:%S.%LZ Time_Keep On
注:
Time_Key需对应你应用输出的OTel日志中的时间字段名,若字段名不同请自行调整。
- 配置Tail输入插件
修改Fluent Bit主配置文件,指定读取目标应用的容器日志文件,并启用上述解析器:
[INPUT] Name tail Path /var/log/containers/*your-app-*.log Parser otel-json Tag k8s.otel.logs Mem_Buf_Limit 5MB Skip_Long_Lines On
替换
*your-app-*.log为你的应用容器日志的匹配规则,确保只读取目标应用的日志。
- 配置输出到数据库
添加对应数据库的输出插件配置(以PostgreSQL为例),将解析后的结构化OTel日志发送至目标库:
[OUTPUT] Name postgresql Match k8s.otel.logs Host your-db-host Port 5432 Database your-db-name User your-db-user Password your-db-pass Table otel_logs Time_Key log_time
需要部署OpenTelemetry Collector的场景
如果你的应用输出的是二进制OTLP格式日志,或需要统一管理日志、指标、链路等遥测数据,建议引入OpenTelemetry Collector作为中间层:
部署OTel Collector
以Sidecar模式部署Collector与应用容器同Pod,或部署为DaemonSet覆盖所有节点。配置Collector采集日志
在Collector配置中使用filelog输入插件读取应用容器日志,并解析OTel格式:
receivers: filelog: include: ["/var/log/containers/*your-app-*.log"] operators: - type: json_parser parse_from: body output: attributes - type: timestamp from: attributes.time layout: '%Y-%m-%dT%H:%M:%S.%LZ' exporters: otlp: endpoint: "fluent-bit-service:4317" tls: insecure: true service: pipelines: logs: receivers: [filelog] exporters: [otlp]
- 配置Fluent Bit接收OTLP数据
启用Fluent Bit的opentelemetry输入插件,接收来自Collector的OTLP日志:
[INPUT] Name opentelemetry Listen 0.0.0.0 Port 4317 [OUTPUT] Name your-db-plugin Match * # 数据库相关配置...
额外说明
- 若你的应用支持直接配置OpenTelemetry导出器,建议直接将日志发送至OTel Collector或Fluent Bit的OTel输入插件,避免STDOUT中转的额外开销。
- 确保Fluent Bit和OTel Collector在K8s中拥有足够权限读取容器日志文件(通常通过绑定
view权限的ServiceAccount实现)。
内容的提问来源于stack exchange,提问作者hugehead
相关产品推荐
相关产品推荐

