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 项目、排障当下。超出这个边界(多主机、历史回溯、告警、长期分析),就必须集中化。

观测云落地:Compose 应用的集中化日志

  1. 采集:在宿主机部署 DataKit(容器形态,挂载 docker.sock),自动采集该宿主机全部容器日志;按 compose 项目名、服务名打标 service,天然保留 Compose 的服务维度。
  2. 解析:单行 JSON 自动解析;多行堆栈用多行合并规则还原;Pipeline 映射标准 status/time
  3. 检索:日志查看器按 service 过滤等价于 compose logs <服务>,但支持全文检索、时间窗、跨主机聚合。
  4. 告警:监控器对 error 日志、关键字(OOM、connection refused)设规则,通知对象发钉钉/企业微信/飞书;服务半夜崩了不再靠人肉盯终端。
  5. 治理:多索引按服务拆保留策略;历史数据转发归档对象存储——容器和主机都没了,日志还在。

常见问题(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)。要长期保留与跨机检索,接入观测云:多索引保留策略按天/周/月灵活配置,归档数据可存数年。

系列阅读


获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

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

立即开始

选择观测云版本

代码托管平台