Docker Compose 日志指南:多容器日志的查看、过滤与集中化
Docker Compose 日志中文指南:docker compose logs 聚合视图、按服务过滤、--index 指定实例、--no-log-prefix/--timestamps/--no-color 输出定制、多行日志拆散问题、Dozzle 可视化,以及观测云 DataKit 集中化采集告警方案。
Docker Compose 用一份 YAML 编排多容器应用,docker compose logs 则把所有服务的日志聚合成一个交错视图——这正是它与 docker logs 的核心差异。本文讲解 Compose 日志的查看过滤技巧、已知局限与集中化落地方案。
核心要点速览
- compose logs = 全服务聚合流:输出自动带服务名前缀并着色,一次看清多服务交互。
- 按服务名过滤(不是容器名):
docker compose logs web;多副本用--index精确到实例。 --no-log-prefix+--timestamps:导出干净可处理的时间戳日志流。- 多行日志会被拆散:每行成为独立条目——生产请用单行 JSON,或上集中化平台。
1. 基础查看与过滤
docker compose logs # 全部服务聚合输出
docker compose logs -f # 实时跟踪
docker compose logs web api # 只看 web 和 api 服务
docker compose logs --tail 50 web
docker compose logs --since 10m
docker compose logs web --index 1 # 多副本服务的第 1 个实例
注意传的是 Compose 文件里的服务名(如 web),不是容器名(如 myapp-web-1)——这样多副本的日志会按服务聚合展示。
2. 输出格式定制
docker compose logs --no-log-prefix # 去掉 "web-1 | " 前缀,便于复制处理
docker compose logs -t # 每行加 ISO-8601 时间戳
docker compose logs --no-color # 禁用颜色(写文件时)
docker compose logs --no-log-prefix -t web > web.log # 导出干净日志
多行日志的坑:Compose(与 Docker 驱动)按行切分日志——JSON 美化输出、Java 堆栈这类多行日志,每一行都会变成独立的日志条目,上下文完全打散。根治办法是让应用输出单行 JSON(堆栈作为字段值),导出后可再用 jq 美化阅读。
3. 可视化工具:Dozzle
Compose 栈的日志可以用 Dozzle 提供实时 Web 界面:
services:
dozzle:
image: amir20/dozzle:latest
volumes:
- /var/run/docker.sock:/var/run/docker.sock
ports:
- "8888:8080"
浏览器打开 8888 端口即可按容器查看实时日志,"Pin as column" 支持多容器并排对比——排查服务间调用问题(A 调 B 超时)时,两个服务的日志并排滚动非常直观。
4. Compose 日志的天花板
Compose 日志方案适用的边界:单机、单 Compose 项目、排障当下。超出这个边界(多主机、历史回溯、告警、长期分析),就必须集中化。
观测云落地:Compose 应用的集中化日志
- 采集:在宿主机部署 DataKit(容器形态,挂载 docker.sock),自动采集该宿主机全部容器日志;按 compose 项目名、服务名打标
service,天然保留 Compose 的服务维度。 - 解析:单行 JSON 自动解析;多行堆栈用多行合并规则还原;Pipeline 映射标准
status/time。 - 检索:日志查看器按
service过滤等价于compose logs <服务>,但支持全文检索、时间窗、跨主机聚合。 - 告警:监控器对 error 日志、关键字(OOM、connection refused)设规则,通知对象发钉钉/企业微信/飞书;服务半夜崩了不再靠人肉盯终端。
- 治理:多索引按服务拆保留策略;历史数据转发归档对象存储——容器和主机都没了,日志还在。
常见问题(FAQ)
docker compose logs 和 docker logs 有什么区别?
docker logs 面向单个容器;docker compose logs 聚合整个 Compose 项目的所有服务,自动加服务名前缀与颜色,支持按服务名过滤。底层读的同样是驱动落盘的日志。
服务有多个副本时日志怎么区分?
默认按服务聚合(这正是聚合的意义)。需要看单个副本用 --index N;DataKit 采集时容器名/实例 ID 会作为字段保留,平台侧可按实例过滤。
Compose 里能给某个服务单独配日志驱动吗?
可以,服务的 logging: 段落支持 driver 与 options,覆盖全局 daemon.json 配置。例如让某个高频服务用更大的 max-size。但同一主机上混用多种驱动会增加运维复杂度,建议统一 local 驱动 + DataKit 采集。
历史日志能保留多久?
本地受驱动轮转参数限制(local 默认每容器 100MB)。要长期保留与跨机检索,接入观测云:多索引保留策略按天/周/月灵活配置,归档数据可存数年。
系列阅读
- 上一篇:docker logs 命令详解
- 下一篇:Heroku 日志实战
- 相关阅读:Docker 日志策略与最佳实践 | 日志聚合