Docker Compose 日志指南:多容器日志的查看、过滤与集中化

Docker Compose 日志中文指南:docker compose logs 聚合视图、按服务过滤、--index 指定实例、--no-log-prefix/--timestamps/--no-color 输出定制、多行日志拆散问题、Dozzle 可视化,以及观测云 DataKit 集中化采集告警方案。

最佳实践
Docker Compose 日志指南:多容器日志的查看、过滤与集中化技术指南封面

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)。长期检索需另行配置集中存储与保留策略,并核对归档恢复方法。

系列阅读


获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台