docker logs 看不到日志的根本原因是应用未输出到 stdout/stderr,而 docker 仅捕获主进程的标准输出;需修改日志配置指向 console,避免写文件,并合理设置日志驱动限流与轮转。

docker logs 看不到日志?先确认应用是否真输出到 stdout
很多情况下 docker logs 返回空或极少内容,根本原因不是命令用错,而是应用自己没往标准输出打日志。Docker 只捕获容器主进程的 stdout 和 stderr,其他路径(比如写入 /var/log/app.log)它完全看不见。
- 验证方法:运行
docker run --rm alpine echo "test",再执行docker logs $(docker ps -lq)能看到输出;但docker run --rm alpine sh -c 'echo "test" > /tmp/out'就看不到 - 常见踩坑点:Java 应用默认用 logback 或 log4j 写文件、Node.js 用了
fs.appendFile、Python 的logging.FileHandler—— 这些都得改配置,把日志目标切到console或stdout - 精简镜像(如
distroless或scratch)里没有sh,别指望进容器cat /var/log/xxx查,要么换带调试工具的镜像,要么提前在构建时注入日志输出逻辑
实时跟踪日志时卡顿甚至假死?别硬扛大日志量
docker logs -f 在日志量极大(比如每秒几百行、总大小超 GB)时会明显卡顿,甚至触发 Docker daemon OOM,这不是网络或终端问题,是 Docker API 流式读取机制本身的瓶颈。
- 替代方案优先用
journalctl -u docker.service查 Docker 守护进程自身异常(如容器反复重启、镜像拉取失败),它和容器日志无关但常被忽略 - 真正要查容器输出,小范围调试用
docker logs --tail=200 -f container_name,避免从头读;大日志量场景直接去宿主机读 JSON 文件更稳:sudo tail -f $(docker inspect -f '{{.LogPath}}' container_name) - 注意:JSON 日志每行是一个对象,含
"log"、"stream"、"time"字段,想纯文本过滤可用grep -o '"log":"[^"]*"' | cut -d'"' -f4,别用cat xxx-json.log | grep error—— 会漏掉跨字段匹配
多个容器一起跑,怎么快速定位哪个挂了?别全量查
“查所有容器日志”听起来全面,实际效率极低。重点不是“全看”,而是“快速筛出异常信号”。用组合命令比一个个 docker logs 敲快得多。
- Compose 环境直接上
docker-compose logs -f --tail=50 web api,指定服务名 + 行数,避免混屏干扰 - 非 Compose 场景,用这个一行扫:
for c in $(docker ps --format "{{.Names}}"); do echo "== $c =="; docker logs --tail=10 "$c" 2>/dev/null | head -3; done—— 每个容器只取最新 10 行里的前 3 行,一眼看出谁在疯狂报错或输出空行 - 如果某容器已退出,
docker ps -a才能看见,docker ps默认只列运行中状态;退出容器的日志仍可查,但不能-f(没进程在写)
日志文件塞爆磁盘?默认 json-file 驱动必须设限
/var/lib/docker/containers/xxx/xxx-json.log 不会自动轮转,尤其在高频日志场景下,单个文件几天就能涨到几十 GB,最终导致宿主机磁盘满、容器无法启动。
- 临时清理:用
truncate -s 0 /var/lib/docker/containers/*/...-json.log清空(慎用,别删错文件),但治标不治本 - 长期方案必须配日志限制,启动容器时加参数:
--log-opt max-size=10m --log-opt max-file=3,表示单个日志文件最大 10MB,最多保留 3 个轮转文件 - 生产环境别依赖
docker logs做采集,它不支持 offset 追踪;要用filebeat或fluentd直接监听 JSON 文件,并开启close_removed: true防止容器删了但句柄还占着
最常被忽略的一点:journalctl -u docker 查的是 Docker daemon 日志,不是你的应用日志;想让应用日志进 journal,得改 dockerd 启动参数加 --log-driver=journald 并重启服务,否则怎么查都找不到。










