如何把 Docker 容器的日志重定向到指定文件?
Docker 日志默认写入 /var/lib/docker/containers 下的 JSON 文件。自定义日志位置可用 syslog/journald 日志驱动,或 docker logs 命令导出,或直接挂载卷让应用写文件。
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-size 和 max-file 轮转;根本方案是采集到观测云后本地只保留少量轮转文件。