单机Docker Compose日志统一方案首选Fluentd本地归档或Loki+Promtail:前者轻量落盘支持gzip压缩与lnav检索,后者提供标签化查询和LogQL;注意驱动切换、权限配置、时区同步及避免循环采集。

在单机 Linux 环境下,用 Docker Compose 启动多个容器时,默认日志分散在各容器 stdout/stderr 中,直接 docker logs 查看费时且难关联。要统一收集、查看、检索,核心思路是:**让所有容器日志输出到一个集中后端(如 Fluentd / Loki / Filebeat),再配合轻量级可视化或 CLI 工具**。无需部署整套 ELK,本地单机推荐“Fluentd + 文件归档 + grep/less/lnav” 或 “Loki + Promtail + Grafana(轻量版)” 方案。
方案一:Fluentd 本地转发 + 日志文件归档(最轻量)
适合开发测试、无外部依赖、只求统一落盘和快速检索的场景。
- 新建
fluentd/conf/fluent.conf,配置监听 Docker 日志驱动(forward或docker插件),并按服务名分目录写入本地文件:
<source>
@type forward
port 24224
</source><p><filter docker.>
@type record_transformer
<strong>enable_ruby</strong><strong>record</strong> service ${tag_parts[1]}
</filter></p><p><match docker.>
@type file
path /var/log/compose/${record['service']}/%Y%m%d
time_slice_format %Y%m%d
time_slice_wait 10m
time_format %Y%m%dT%H%M%S%z
compress gzip
</match></p>
- 在
docker-compose.yml中为每个服务启用fluentd日志驱动,并指定 Fluentd 地址(本机即localhost:24224):
services:
web:
image: nginx:alpine
logging:
driver: "fluentd"
options:
fluentd-address: "localhost:24224"
tag: "docker.web"
<p>api:
image: python:3.11-slim
logging:
driver: "fluentd"
options:
fluentd-address: "localhost:24224"
tag: "docker.api"</p>
- 启动 Fluentd 容器(绑定宿主机端口和日志目录):
docker run -d \ --name fluentd \ -p 24224:24224 \ -v $(pwd)/fluentd/conf:/fluentd/etc \ -v /var/log/compose:/var/log/compose \ -u root \ fluent/fluentd:latest
- 日志将自动写入
/var/log/compose/web/20240515.log.gz、/var/log/compose/api/20240515.log.gz等路径,可用zcat | grep或lnav(支持压缩+多文件+语法高亮)直接查看:
lnav /var/log/compose/**/*.{log,log.gz}
方案二:Loki + Promtail(带时间线检索与简单 Web 界面)
适合需要按时间范围、标签(service、host)、关键词组合查询的用户,资源占用仍可控(Loki 单进程 + Promtail 轻量采集)。
- 在
docker-compose.yml中一并定义 Loki、Promtail 和你的业务服务:
version: '3.8'
services:
loki:
image: grafana/loki:2.9.2
command: -config.file=/etc/loki/local-config.yaml
volumes:
- ./loki/config.yaml:/etc/loki/local-config.yaml
- ./loki/data:/data
ports:
- "3100:3100"
<p>promtail:
image: grafana/promtail:2.9.2
command: -config.file=/etc/promtail/config.yml
volumes:</p>
- ./promtail/config.yml:/etc/promtail/config.yml
- /var/lib/docker/containers:/var/lib/docker/containers:ro
- /var/run/docker.sock:/var/run/docker.sock
web: image: nginx:alpine labels:
Promtail 自动发现的关键:加 label 标记服务名
- "loki.labels=job=web,service=web"
api: image: python:3.11-slim labels:
- "loki.labels=job=api,service=api"
- 配置
promtail/config.yml使用docker发现模式,提取容器日志并打上服务标签:
server: http_listen_port: 9080
- 配置
positions: filename: /tmp/positions.yaml
clients:
scrape_configs:
- job_name: docker
static_configs:
- targets:
- localhost
labels:
job: docker
path: /var/lib/docker/containers//-json.log
- 启动后访问
http://localhost:3100(Loki API)或搭配轻量 Grafana(docker run -p 3000:3000 grafana/grafana)添加 Loki 数据源,即可用 LogQL 查询,例如:
{job="web"} |= "404" | line_format "{{.log}}" | unwrap ts - 启动后访问
- localhost
labels:
job: docker
path: /var/lib/docker/containers//-json.log
- targets:
关键注意事项
-
日志驱动兼容性:Docker 默认使用
json-file驱动,Fluentd/Loki 均需改用对应驱动(fluentd或loki),否则采集不到原始日志流; -
权限与路径映射:Promtail 读取
/var/lib/docker/containers需容器有ro权限,Fluentd 写日志目录需宿主机提前创建并确保可写; -
时间同步:容器内时间若与宿主机偏差大,会导致日志时间戳错乱,建议所有容器加
environment: - TZ=Asia/Shanghai并校准系统时钟; -
避免循环采集:不要让 Promtail 或 Fluentd 自身日志也被采集(可在配置中加
pipeline_stages过滤或relabel_configs排除)。
替代捷径:仅需实时聚合查看?用 docker compose logs -f
如果只是临时调试、不需要持久化和检索,Compose 原生命令已足够:
-
docker compose logs -f:合并所有服务日志,带服务名前缀(如web-1 | 127.0.0.1 - - [15/May/2024...]); -
docker compose logs -f --since 1h web api:只看最近 1 小时 web 和 api 的日志; - 配合
grep或ccat(带颜色)提升可读性:docker compose logs -f | ccat | grep -i error。
不复杂但容易忽略:默认 docker compose logs 只显示当前运行容器的日志,重启后旧日志丢失——如需保留,必须走上述采集方案落盘或发往 Loki。











