fluentd是日志采集与处理系统,负责从容器等源收集日志、解析为结构化字段、按规则路由至es/kibana等后端分析平台;其核心能力在于“收得全、理得清、送得准”,而非直接分析日志。

Fluentd 不是日志分析工具,而是日志的“搬运工”和“加工台”——它负责把容器日志收进来、理清楚、再送出去。真正做分析的,是后端的 Elasticsearch + Kibana、Grafana、或者 Splunk 这类平台。配合的关键,在于 Fluentd 做好三件事:收得全、理得清、送得准。
日志采集阶段:确保容器输出能被 Fluentd 捕获
Docker 默认把 stdout/stderr 写成 JSON 文件(json-file 驱动),但这种方式只适合本地查看,不适合集中分析。必须改用可转发的日志驱动:
- 在
docker-compose.yml中配置:services: api: image: my-api:v1 logging: driver: "fluentd" options: fluentd-address: "192.168.1.50:24224" tag: "app.api.${HOSTNAME}" fluentd-async-connect: "true" # 防止 Fluentd 挂掉时阻塞容器 - 或启动单个容器时:
docker run --log-driver=fluentd \ --log-opt fluentd-address=192.168.1.50:24224 \ --log-opt tag=web.nginx \ nginx✅ 关键点:
tag要带业务标识(如服务名、环境、主机名),后续过滤和索引都靠它区分。
日志解析阶段:让原始日志变成结构化字段
容器 stdout 输出通常是纯文本(比如 "2026-08-13T10:22:35Z INFO user login success"),Fluentd 需要把它拆解成 time, level, message, user_id 等字段,才方便分析。
常用做法:
- 用
<filter></filter>插件配合正则或 parser 插件:<filter app.> @type parser key_name log reserve_data true <parse> @type regexp expression /^(?<time>\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}Z) (?<level>\w+) (?<message>.*)$/ time_key time time_format %Y-%m-%dT%H:%M:%SZ </message></level></time></parse></filter> - 对多行日志(如 Java 异常堆栈)启用
multiline解析:<filter app.> @type multiline multiline_flush_interval 5s <parse> @type multiline format_firstline /\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}/ format1 /(?<time>\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}) (?<level>\w+) (?<message>.*)/ </message></level></time></parse></filter>✅ 关键点:解析后加
reserve_data true,保留原始log字段,便于全文检索;时间字段必须正确提取并标注为time_key,否则 ES 里时间线会错乱。
日志路由与投递阶段:按需分发到分析平台
解析后的日志,要按类型、环境、敏感度等规则分流:
-
发送到 Elasticsearch(用于全文检索和 Kibana 分析):
<match app.> @type elasticsearch host elasticsearch-prod port 9200 logstash_format true logstash_prefix app-logs include_tag_key true tag_key @log_name </match>
-
把错误日志单独告警(比如发 Slack 或写入 Kafka):
<match app.> @type grep <regexp> key level pattern ^(ERROR|FATAL)$ </regexp></match><match app.> @type slack webhook_url https://hooks.slack.com/services/xxx channel "#alerts" </match>✅ 关键点:避免所有日志一股脑塞进一个索引;用
logstash_format true让 ES 自动生成@timestamp和host字段;生产环境务必开启 TLS 和 Basic Auth,防止日志泄露。
分析层协同:Kibana 里怎么用好 Fluentd 送来的数据
Fluentd 送进来的结构化日志,在 Kibana 里才能真正发挥价值:
- 创建 Index Pattern(如
app-logs-*),自动识别level,service,trace_id等字段 - 用 Discover 查看原始日志,用 Visualize 做错误率趋势图、响应时间分布、高频 IP 统计
- 设定 Alert:比如
level: ERROR且count() > 10 in last 5m→ 触发 PagerDuty - 结合 Prometheus 监控 Fluentd 自身指标(如
fluentd_output_status_buffer_total_bytes),判断是否积压
不复杂但容易忽略











