如何把 Docker 容器的日志重定向到指定文件?

Docker 日志默认写入 /var/lib/docker/containers 下的 JSON 文件。自定义日志位置可用 syslog/journald 日志驱动,或 docker logs 命令导出,或直接挂载卷让应用写文件。

最佳实践
如何把 Docker 容器的日志重定向到指定文件?封面

Docker 的 json-file 日志驱动默认把容器 stdout/stderr 写到 /var/lib/docker/containers/<ID>/<ID>-json.log,这个路径不可自定义。想把日志放到指定文件,常用三种方式:docker logs 导出、切换到 syslog/journald 驱动、或让应用直接写挂载卷里的文件。

方式一:docker logs 导出(临时)

docker logs my-container > /path/to/app.log 2>&1
# 实时跟踪并写入
docker logs -f my-container >> /path/to/app.log 2>&1

方式二:换日志驱动(系统级)

json-file 驱动不支持自定义路径。改用 syslog 让 rsyslog 决定写哪:

docker run --log-driver syslog --log-opt tag=myapp my-image

然后在 /etc/rsyslog.d/ 配置 if $programname == 'myapp' then /var/log/myapp.log

方式三:应用直接写挂载卷

docker run -v /host/logs:/var/log/myapp my-image

应用把日志写到容器内 /var/log/myapp/,实际落在宿主机 /host/logs/

默认日志文件的管理

默认 json 日志会无限增长,建议配置轮转:

// /etc/docker/daemon.json
{
  "log-driver": "json-file",
  "log-opts": { "max-size": "10m", "max-file": "3" }
}

观测云对照

不需要把日志重定向到文件再采集——观测云 DataKit 直接采集容器 stdout/stderr(K8s 环境自动发现),日志统一进入观测云平台检索分析,宿主机上的日志文件只需保留短期轮转即可。

常见问题(FAQ)

Q:改了 daemon.json 后已有的容器生效吗?
A:不生效。日志驱动在容器创建时确定,需要重建容器。

Q:docker logs 看不到日志了?
A:切换到 syslog/journald 驱动后 docker logs 不可用,需要到对应日志文件中查看。

Q:容器日志文件太大占满磁盘?
A:配置 max-sizemax-file 轮转;根本方案是采集到观测云后本地只保留少量轮转文件。

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

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

立即开始

选择观测云版本

代码托管平台