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 项目、排障当下。超出这个边界(多主机、历史回溯、告警、长期分析),就必须集中化。
5. 跨主机日志的采集与验证
需要跨主机查询时,可按观测云 Container 采集器文档接入容器日志。先核对 Docker 日志驱动、采集权限和日志范围,再选择一个 Compose 服务写入测试记录,检查容器标识和服务标签是否符合预期。
应用输出 JSON 不代表字段已经完成解析。应为日志选择并测试 Pipeline,核对时间、级别和请求 ID;多行堆栈则检查合并后的边界。随后在日志查看器中按服务及容器标识查找同一条测试记录,与本地 docker compose logs 的输出比对。
告警规则可以从错误关键字开始,但要用已知失败请求验证命中情况。保留期限则根据调查需求配置,并确认本地轮转前日志已经上报。
常见问题(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 默认每容器 100MB)。长期检索需另行配置集中存储与保留策略,并核对归档恢复方法。
系列阅读
- 上一篇:docker logs 命令详解
- 下一篇:Heroku 日志实战
- 相关阅读:Docker 日志策略与最佳实践 | 日志聚合