容器环境中日志去哪了?如何收集所有容器日志?如何让故障定位不再靠猜?本讲将带你从容器日志机制入手,构建一套实用、可靠、可扩展的容器日志集中采集方案!
一、为什么容器日志管理很重要?
在传统架构中,应用日志一般存储在固定路径,查看方式统一。而在容器环境下,日志管理面临全新挑战:
- 容器是短生命周期,日志易丢失;
- 容器之间动态调度,日志位置不固定;
- 需要集中收集与检索,支撑故障排查和审计;
- 容器采用**标准输出(stdout/stderr)**输出日志,非传统日志路径。
所以,需要构建 "日志采集 ➜ 汇聚 ➜ 存储 ➜ 分析" 的可观测体系。
二、Docker 容器日志机制详解
Docker 默认将容器日志收集至标准输出(stdout)并记录到宿主机文件。
2.1 日志存储路径
容器日志默认路径(以 json-file 驱动为例):
bash
/var/lib/docker/containers/<container-id>/<container-id>-json.log
2.2 日志驱动(log driver)
Docker 支持多种日志驱动,常用有:
驱动名称 | 说明 |
---|---|
json-file | 默认驱动,日志保存在宿主机 JSON 文件中 |
syslog | 发送日志到本地或远程 syslog 服务 |
journald | 与 systemd 集成 |
fluentd | 发送日志到 Fluentd 收集器 |
awslogs | 发送到 AWS CloudWatch |
可通过如下命令设置:
bash
docker run --log-driver=json-file ...
三、集中日志采集系统架构
在生产实践中,通常使用 ELK、EFK、Loki 等日志采集方案。
3.1 架构图

四、三种主流日志方案对比
方案 | 组成 | 特点 |
---|---|---|
ELK | Elasticsearch + Logstash + Kibana | 成熟方案,功能强大,但资源消耗较大 |
EFK | Elasticsearch + Fluentd + Kibana | 更轻量,社区活跃 |
Loki | Grafana Loki + Promtail + Grafana | 原生支持标签,适配容器场景更好,存储成本低 |
五、Fluentd 集中日志采集实战(EFK 示例)
5.1 Fluentd 架构简介
Fluentd 是一个可插拔的数据收集器,支持上百种输入/输出插件。
常见流程:
bash
容器 → stdout → Fluentd → Elasticsearch → Kibana
5.2 安装 Fluentd(Docker Compose 示例)
yaml
fluentd:
image: fluent/fluentd:v1.16
volumes:
- ./fluentd/conf:/fluentd/etc
- /var/lib/docker/containers:/var/lib/docker/containers:ro
- /var/log:/var/log:ro
ports:
- "24224:24224"
- "24224:24224/udp"
5.3 配置 Fluentd 输入与输出
bash
<source>
@type tail
path /var/lib/docker/containers/**.log
pos_file /fluentd/log/docker.pos
tag docker.*
format json
</source>
<match docker.**>
@type elasticsearch
host elasticsearch
port 9200
logstash_format true
</match>
六、基于 Loki 的轻量日志方案
Grafana Loki 是一种专为容器环境设计的日志存储系统,与 Prometheus 类似,支持标签过滤、水平扩展。
6.1 Loki 架构
- Promtail:收集日志并发送给 Loki;
- Loki:存储与索引日志;
- Grafana:统一展示指标和日志。
6.2 Promtail 配置简例
bash
server:
http_listen_port: 9080
positions:
filename: /tmp/positions.yaml
clients:
- url: http://loki:3100/loki/api/v1/push
scrape_configs:
- job_name: docker
static_configs:
- targets:
- localhost
labels:
job: varlogs
__path__: /var/lib/docker/containers/*/*.log
七、Kubernetes 环境下的日志采集
在 K8s 环境中,日志采集推荐使用 DaemonSet 模式部署日志代理:
- 每个 Node 部署一个 Agent;
- 自动采集本机容器日志(/var/log/pods、/var/log/containers);
- 常用组件:Fluentd、Filebeat、Logstash、Vector、Promtail 等。
K8s 日志采集模型

八、日志管理实践建议
场景 | 建议 |
---|---|
容器日志丢失 | 禁止使用 docker logs 查问题,仅用于调试 |
日志格式混乱 | 所有服务使用统一 JSON 格式 |
日志量爆炸 | 引入日志限流机制,避免 DDoS 造成磁盘爆炸 |
故障定位慢 | 日志 + 指标(Prometheus)+ Trace(Jaeger)联动可观测 |
安全合规 | 开启敏感日志脱敏、日志加密存储、留痕审计 |
九、总结
本文回顾了容器日志机制、常用日志采集方案(EFK/Loki)、实际部署方法、Kubernetes 环境下的集中日志方案,并通过 Mermaid 图梳理整体流程。