logs 为空的三种原因
docker logs 输出为空,通常落在这三类:日志驱动不是 json-file 或 local(例如 none、syslog),容器本来就不把日志写到这里;应用把日志写进了容器内的文件而不是标准输出;进程在打印任何内容之前就退出了。三者现象相似,排查顺序建议是先看驱动与进程状态,再看应用到底把输出写到了哪里。
基本信息
| 查驱动 | docker inspect 的 HostConfig.LogConfig.Type |
|---|---|
| 查进程 | State.Status 与 State.ExitCode |
| 查输出目标 | 应用写标准输出还是容器内文件 |
| 特例 | 驱动为 none 时 logs 永远没有内容 |
典型使用场景
- 应用升级后日志消失:日志改为写文件,标准输出自然为空
- 容器启动即退出:进程在初始化阶段就失败,来不及输出
- 日志被外部系统接管:驱动改为转发到集中式日志服务
- 排查采集断链:确认容器侧输出与采集侧配置是否一致
- 容量管理:确认轮转策略是否把历史日志清掉
逐项确认
逐项确认
# 一次拿到驱动、状态与退出码
docker inspect -f 'driver={{.HostConfig.LogConfig.Type}} status={{.State.Status}} exit={{.State.ExitCode}}' web
# 看应用是否把日志写进了容器内文件
docker exec web sh -c 'ls -l /var/log 2>/dev/null | head'
# 直接看底层日志文件(驱动为 json-file 时)
ls -lh /var/lib/docker/containers/*/*-json.log | tail -5原因与处理
| 现象 | 原因 | 处理 |
|---|---|---|
| 运行中但 logs 为空 | 日志驱动不是 json-file 或 local | 改驱动,或在采集侧对接当前驱动 |
| logs 空但容器内有文件 | 应用写文件而非标准输出 | 改为输出到标准输出,或挂卷后采集文件 |
| 启动即退出且无输出 | 进程在打印前失败 | 看退出码与启动命令,必要时手动执行同一命令 |
| 日志被截断 | 轮转或大小限制生效 | 调整轮转策略与保留份数 |
容器已退出时无法进入容器查看,文件层面的排查要么在运行中完成,要么把日志目录挂载出来事后查看。
先核对驱动再查应用:驱动为 none 的容器永远不会产生 logs,这一条能省掉大量无效排查。