docker logs 命令详解:容器日志查看的完整手册
docker logs 命令中文详解:-f 实时跟踪、--tail 按行截取、--since/--until 时间过滤、--timestamps 时间戳、--details 附加信息、多容器组合技巧与局限,以及观测云 DataKit 实现跨容器集中检索告警的方案。
docker logs 是容器排障的第一命令,但它的能力边界也很清晰:单机、单容器、无检索。本文系统讲解 docker logs 的全部选项与组合技巧,并说明什么时候该升级到集中化日志平台。
核心要点速览
- docker logs 读的是驱动落盘的日志流:json-file/local 驱动下可用,其他驱动可能返回空。
- 四大高频选项:
-f实时跟踪、--tail只看末尾、--since/--until按时间窗过滤、-t补时间戳。 - stdout 与 stderr 都被捕获:可加
--details查看流标记。 - 局限即升级信号:要跨容器/跨主机检索、聚合、告警时,该上观测云集中化方案了。
1. 基础用法
docker logs <容器名或ID>
输出容器自启动以来写入 stdout/stderr 的全部内容。容器没在产生日志?先用 docker run --name vector-demo -d timberio/vector:latest-alpine 这类持续输出日志的镜像做实验。
2. 高频选项组合
docker logs -f myapp # 实时跟踪(Ctrl+C 退出)
docker logs --tail 100 myapp # 只看最后 100 行
docker logs --since 30m myapp # 最近 30 分钟
docker logs --since 2026-08-25T14:00:00 --until 2026-08-25T15:00:00 myapp
docker logs -t myapp # 每行加 ISO-8601 时间戳
docker logs --details myapp # 显示日志属性(流类型等)
docker logs --tail 50 -f -t myapp # 组合:带时间戳跟踪最近 50 行起的增量
排障典型流程:--since 定位故障时间窗 → 找到关键错误 → 加 -f 复现观察 → 需要更多上下文时加大 --tail。
3. 进阶技巧
# 只过滤错误行(配合 grep)
docker logs myapp 2>&1 | grep -i error
# 只取 stderr 流
docker logs myapp 2>/dev/null # stdout 丢弃,只剩 stderr?不——
# 正确姿势:docker logs 把两流都输出,用重定向分离:
docker logs myapp 1>/tmp/out.log 2>/tmp/err.log
# 多个容器轮流看(脚本化)
for c in web-1 web-2 web-3; do docker logs --tail 20 $c; done
4. docker logs 的能力边界
| 需求 | docker logs | 集中化平台(观测云) |
|---|---|---|
| 单容器实时看 | ✅ | ✅ |
| 按关键字全文检索 | ❌(靠 grep) | ✅ DQL/关键字 |
| 跨容器/跨主机聚合 | ❌ | ✅ 按 service/标签分组 |
| 历史回溯(容器已删) | ❌ | ✅ 持久化存储 |
| 模式聚类/错误率趋势 | ❌ | ✅ 聚类分析/图表 |
| 告警 | ❌ | ✅ 监控器 + 钉钉/企微/飞书 |
观测云落地:从 docker logs 到集中化日志平台
- 采集:DataKit 容器部署(挂载 docker.sock 与容器日志目录),自动采集全部容器 stdout/stderr,按镜像/容器名/compose 项目打标
service。 - 解析:单行 JSON 自动解析;多行堆栈用多行合并规则还原;Pipeline 映射标准
status/time。 - 检索:日志查看器替代"逐机 docker logs + grep"——一个界面检索所有主机所有容器。
- 告警:监控器对 error 级别、关键字(OOMKilled、panic)设规则,告警策略路由钉钉/企业微信/飞书;事件中心统一收敛。
- 治理:多索引按服务拆保留期,历史数据转发归档对象存储——容器删了日志还在。
常见问题(FAQ)
docker logs 报 "configured logging driver does not support reading"?
容器用了 syslog/fluentd 等外送型驱动,日志不在本地。要么切回 json-file/local,要么从对应后端查看。这也是推荐 local 驱动的原因之一:本地可查 + 采集层外送两不误。
--since 和 --until 支持哪些时间格式?
RFC3339(2026-08-25T14:00:00)、相对时间(30m、2h、1h30m)、Unix 时间戳。跨时区注意带上时区偏移。
日志文件很大,docker logs 卡住了?
先 --tail 或 --since 缩小范围。长期方案:确认驱动轮转参数(max-size/max-file)生效,并用观测云集中化查询替代直接读大文件。
容器重启后还能看到重启前的日志吗?
docker logs 默认只看当前运行实例的日志。docker logs --previous 可查看上一个实例(崩溃前)的日志——容器莫名重启时的救命选项。超过一个重启周期的历史就要靠集中化平台了。
系列阅读
- 上一篇:Docker 日志策略与最佳实践
- 下一篇:Docker Compose 日志指南
- 相关阅读:Linux 系统日志管理入门 | 什么是日志管理