马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
一、为什么容器日志 要用 docker logs 看
容器和传统服务器最大的区别之一:容器里没有常驻的登录终端。你没法像以前那样 ssh 进机器、tail -f /var/log/nginx/access.log,所以"进容器翻文件"这条路在容器化之后基本走不通了。
容器应用的日志 默认走标准输出(stdout)和标准错误(stderr)。 Docker 引擎在宿主上接管了这两路输出,按JSON 行的格式存到容器自己的日志 目录里(默认在 /var/lib/docker/containers/<容器ID>/ 下)。
于是查看容器日志就有了统一入口:docker logs。它本质上是把那个日志文件读出来打到终端,只不过附带来了几个控制参数。
先记住最关键的一条限制:docker logs 只能显示容器自己产生到 stdout/stderr 的日志。如果应用把日志写进了容器内的某个文件(比如自己指定路径的 app.log),那 docker logs 是看不到的,得靠挂载卷把那个文件目录映射出来,或者进容器用 docker exec 去看。
二、最基础的一条命令
docker logs [容器ID或名称]
容器 ID 不用打全,前几位能唯一标识就行;当然也可以直接写容器名——大多数时候用 -f 时最好用名字,敲起来短。
三、实时跟踪:像 tail -f 一样
想一直盯着最新输出,加 -f(follow):
docker logs -f [容器ID或名称]
行为和 tail -f 一致:从头往后读,新日志一产生就追加到屏幕上。这个参数必须配一个具体容器,不能空着;另外它在容器被删掉时会跟着退出,不必另加退出条件。
生产排障时通常不会一直 -f 干等,而是配合下面的范围参数先用 --tail 回到"最近一段",确认没问题再切成 -f。
四、只看最近几行:-tail
日志量大的时候,全量输出会刷爆屏幕,用 --tail 限制行数,后面跟上想看的行数:
docker logs --tail=100 [容器ID或名称] # 只看最后 100 行
docker logs --tail=10 -f [容器ID] # 从最后 10 行开始,再持续跟
docker logs --tail=0 -f [容器ID] # 不历史输出,直接进入实时跟踪
--tail=0 是个很实用的组合:只想从现在这一刻开始盯,不要刚才的历史,就写它,避免被几百行启动日志淹没。
五、带时间戳:-timestamps
排查跨服务问题时,"这行日志是什么时候打的"往往比内容本身更重要。加 --timestamps(可简写 -t):
docker logs --timestamps [容器ID或名称]
docker logs -t --tail=50 [容器ID]
输出的每一行前面会带上时间戳,默认精确到秒。注意这个时间是容器宿主的本地时间,不是容器内的时区设置——跨机器比对日志时,建议所有节点统一 NTP 并统一时区,不然对齐不上。
六、只看某个时间段:-since 与 -until
线上出问题时,你通常只关心"故障那几分钟"。--since 后面跟相对时间或具体时间戳,--until 同理表示截止点。
docker logs --since=30m [容器ID] # 最近 30 分钟
docker logs --since=1h --tail=200 [容器ID] # 最近 1 小时里的最后 200 行
docker logs --since="2026-04-01" [容器ID] # 2026-04-01 之后
docker logs --since="2026-04-01 10:00" --until="2026-04-01 11:00" [容器ID]
- 相对时间:
30m(30 分钟)、1h(1 小时)、24h、10d。只写数字不带单位是无效的。
- 绝对时间:写成
"2026-04-01 10:00:00" 这样的完整格式更保险,只写日期会被当成当天 00:00。
--until 可以省:不写就是一直看到现在。
组合 --since + --tail 是排障最顺手的姿势:先按时间圈出故障窗口,再限制行数避免刷屏。
七、参数速查表
| 参数 | 作用 | 常用示例 |
-f | 实时跟踪新日志(类似 tail -f) | docker logs -f nginx |
--tail | 只显示末尾 N 行 | --tail=100 |
-t / --timestamps | 每行前加时间戳 | docker logs -t container |
--since | 只显示某个时间点之后的日志 | --since=30m |
--until | 只显示某个时间点之前的日志 | --until="2026-04-01 11:00" |
-n | 显示日志条数( newer 语义,Docker 新版本已弃用) | 建议改用 --tail |
八、几个实战组合
# 服务刚重启,盯最近 200 行有没有报错
docker logs -f --tail=200 web
# 故障发生 10 分钟前到现在,带时间戳
docker logs -t --since=10m web
# 只看今天上午那次失败的启动过程
docker logs --since="2026-04-01 09:00" --until="2026-04-01 10:00" -t web
# 把容器日志导出来离线分析
docker logs web > web.log 2>&1
九、两个容易忽略的点
- 日志会占满磁盘:
docker logs 读的是磁盘上的 JSON 日志文件,长期不管可以长到几十 GB。务必配置日志驱动轮转(log-driver 用 json-file 时配 max-size / max-file,或改用 local / 可选远程驱动),否则磁盘被写满会导致新容器起不来。
- 日志驱动不同,
docker logs 可能完全不可用:如果启动容器时指定了 --log-driver=none 或把日志送到外部系统(如 syslog、fluentd),那 docker logs 就取不到东西。这时候要用 docker inspect <容器> | grep Mounts 看日志挂载,或者查对应的外部日志系统。
小结
记住四句话就够日常用了:
- 看全部:
docker logs 容器名。
- 实时盯:
docker logs -f --tail=0 容器名(不想看历史就 --tail=0)。
- 看时间范围:
docker logs --since=30m -t 容器名。
- 只认 stdout/stderr 的日志;写进容器内文件的日志要挂卷或用
docker exec 看。
再加上日志轮转配置,容器日志这块基本不会出问题。
(本文由 qidao123.com企服评测-应用市场 编辑提示整理:示例基于 Docker Engine 的 docker logs 命令,适用于主流 Linux 发行版上的 Docker 20.10+ 版本。) |