Docker分布式日志采集与清洗需分三步:一、应用强制输出结构化JSON到stdout/stderr,并显式配置json-file驱动及max-size/max-file轮转;二、用Fluent Bit或Logspout容器化采集,避免挂载宿主机路径;三、在采集器内完成解析、脱敏、打标和路由,前置清洗降低下游压力。

用 Docker 实现容器化分布式日志采集与清洗,核心不是“堆组件”,而是分三步走:让日志能稳定出来、能集中收上来、能结构化洗出来。关键在日志源头可控、采集链路不丢、清洗逻辑可维护。
一、统一日志输出规范:从应用容器开始约束
日志质量决定后续所有环节的效率。别等采集再处理格式混乱的日志。
- 强制应用将日志写入 stdout/stderr,禁用文件落盘(除非业务强依赖);Docker 只捕获这两路流
- 要求日志输出为结构化 JSON,例如:
{"level":"error","ts":"2026-04-19T01:00:00Z","msg":"db connection timeout","service":"auth-api"} - 容器启动时通过 --log-driver=json-file 显式声明(避免依赖守护进程默认值),并立即配轮转:
--log-opt max-size=10m --log-opt max-file=3
二、部署轻量级采集器:Logspout 或 Fluent Bit 容器化接入
不推荐直接挂载宿主机日志路径,应让采集器以容器身份自动发现并接管日志流。
- Logspout 适合快速验证:它监听
/var/run/docker.sock,自动连接新容器 stdout,支持 syslog、HTTP、Kafka 等后端
示例命令:
docker run -d --name logspout --restart=always \
-v /var/run/docker.sock:/var/run/docker.sock \
gliderlabs/logspout syslog://your-syslog-server:514 - Fluent Bit 更适合生产:资源占用低、支持过滤+解析+重试,建议用 ConfigMap 挂载配置
关键配置段(解析 JSON 日志):
[FILTER]
Name parser
Match *
Key_Name log
Parser json
三、清洗与路由:在采集器内完成初步结构化
越早清洗,下游存储和查询压力越小。把字段提取、敏感脱敏、服务打标这些动作前置到 Fluent Bit 或 Logstash 容器中。
- 给每条日志自动添加上下文字段,如:
[FILTER]
Name modify
Match *
Add service_name ${HOSTNAME}
Add env production - 对含密码、token 的日志行做正则脱敏(用
grep插件或 Lua 过滤):
"password=.*?" → "password=***" - 按 service 或 level 路由到不同目标:错误日志发 Slack webhook,访问日志进 Elasticsearch,审计日志进对象存储
四、对接中心化后端:ELK / Loki / SLS 等选型要点
后端不是越重越好,要看团队运维能力和分析需求。
- 中小团队优先用 Loki + Promtail:只索引标签(如
{job="api",level="error"}),不全文建索引,成本低、查慢日志快 - 需要关键词检索+可视化看板 → 用 ELK,但务必限制索引生命周期(ILM),避免磁盘爆满
- 已有阿里云/SLS 生态 → 直接用 loongcollector 容器,自动发现容器、支持字段索引、内置常见解析模板











