docker logs 是干什么的
docker logs 读取容器主进程写到标准输出与标准错误的日志,是容器排障的第一个入口。它支持实时跟随、只看尾部若干行、按时间范围读取与加时间戳,但它的能力受日志驱动限制:默认驱动会把日志留在本机可读,换成其他驱动后可能就要去日志系统里查了。
基本信息
| 基本语法 | docker logs [选项] 容器 |
|---|---|
| 常用参数 | -f 实时跟随 / --tail N 只看最后 N 行 / -t 显示时间戳 / --since 时间范围 |
| 日志来源 | 容器主进程及其子进程写到标准输出与标准错误的内容 |
| 日志驱动 | 默认按行保存到本机文件;也可转发到日志系统或直接丢弃 |
| 轮转 | 默认不轮转,需显式配置单文件大小与文件数量上限 |
| 不可读情况 | 驱动被设为只转发或丢弃时,命令行读不到历史日志 |
典型使用场景
- 服务起不来时看启动报错:配置错误、端口占用、依赖连不上都会在这里暴露
- 发布后验证:跟随日志观察请求是否正常处理,确认没有异常堆栈
- 崩溃复盘:容器反复重启时,配合上一次运行的日志定位崩溃原因
- 按时间窗定位:用时间范围参数只看故障发生那几分钟的输出
- 写入文件留证:把日志导出到文件,供后续分析或提交工单
- 确认日志是否真的在输出:日志为空时先排除应用把日志写到文件里的可能
常用参数速查
| 参数 | 作用 | 使用注意 |
|---|---|---|
| -f | 实时跟随输出 | 排查结束后要主动退出,否则一直挂着 |
| --tail 200 | 只看最后 200 行 | 不加时可能一次刷出巨量历史日志 |
| -t | 每行加时间戳 | 与业务日志自带时间对照可判断时区问题 |
| --since 30m | 只看最近 30 分钟 | 定位故障时间窗时最省事 |
| --until | 截止某个时间 | 与 since 配合可截取固定区间 |
| --timestamps | 等价于 -t | 不同版本参数名略有差异 |
常用示例
常用示例
docker logs --tail 200 myapp # 看最后 200 行
docker logs -f --tail 100 myapp # 实时跟随,先给 100 行上下文
docker logs --since 30m myapp # 只看最近 30 分钟
docker logs -t myapp | tail -n 50 # 带时间戳看尾部
docker logs myapp > /tmp/myapp.log 2>&1 # 导出到文件留证
# 日志为空时先确认应用是否把日志写到了容器内文件而没走标准输出默认日志驱动不做轮转:长期运行且输出量大的容器会把磁盘写满,进而拖垮同机所有服务。应在守护进程配置里设置单文件大小与保留文件数,或改用日志系统收集。
容器日志只覆盖主进程的输出:应用若把日志写到容器内文件,命令行读不到,需要进入容器查看或用日志收集工具采集。
看崩溃现场要用上一次运行的日志:容器重启后当前实例的日志是空的,排查时要指定读取上一实例的输出。
日志时间戳能帮上大忙:把容器日志时间与应用日志时间对照,可以快速判断时区配置是否与实际一致。
长期运行的日志治理
- 为日志设置单文件大小与保留数量,避免磁盘被逐步写满
- 接入集中日志系统,容器重建后历史日志仍然可查
- 统一日志格式与时间戳,跨服务串联排查才可行
- 把关键错误做成告警,不必依赖人工定时翻日志