docker logs 是什么
docker logs 读取容器主进程的 stdout 与 stderr 历史输出,也就是容器日志。它只覆盖标准流:应用自己写进文件、写进 rsyslog 或直接落盘的日志不在其中,这类日志要靠 exec 进容器或挂载目录去看。
基本信息
| 语法 | docker logs [选项] CONTAINER |
|---|---|
| 高频选项 | --tail 100 末尾 100 行 -f 跟随输出 -t 显示时间戳 --since/--until 时间窗 |
| 可读前提 | 日志驱动为 json-file、local、journald 等本地驱动 |
| 权限要求 | 能访问 Docker 守护进程并读取该容器 |
典型使用场景
- 容器起不来或反复重启:看主进程最后打印了什么,通常是配置缺失、依赖连不上、端口被占
- 服务行为异常时对照输出:请求日志、错误栈、启动耗时都在标准流里
- 变更后确认生效:改了配置重启容器,看日志里加载的参数是不是新值
- 配合 -f 跟踪:灰度发布或压测时盯着实时输出观察错误率变化
- 事故回溯:用时间窗口加时间戳,把日志拉成可与监控图表对齐的证据
常用示例
常用示例
docker logs web # 输出全部日志
docker logs --tail 100 web # 只看最后 100 行
docker logs -f web # 持续跟随,类似 tail -f
docker logs -t --since 30m web # 带时间戳看最近半小时
docker logs web 2>&1 | grep -i error # 流与错误一起抓,按关键字过滤选项读法
| 选项 | 作用 | 使用注意 |
|---|---|---|
| --tail N | 只输出末尾 N 行 | 大日志直接全量输出会刷屏,排障默认先加 tail |
| -f | 跟随新输出 | Ctrl-C 只断开会话,不会停止容器 |
| -t | 每行前加时间戳 | 时间来自容器日志记录时刻,与宿主时区相关 |
| --since/--until | 按时间窗过滤 | 相对时长为 30s/10m/1h,绝对时间用带时区的完整格式 |
| --details | 附带容器级附加信息 | 部分驱动才会输出内容 |
日志在容器被删除(含 --rm 自动删除)后一并消失,需要留存就要配置日志轮转或采集到外部日志系统,别指望出事后再回捞。
应用带输出缓冲时日志会延迟出现,表现为「服务已经在报错但日志是空的」。Python 加 -u 关闭缓冲,Java 注意标准流与日志文件双写导致内容不一致。
典型输出怎么读
- 启动阶段的输出集中在最前面:框架版本、监听地址、加载的配置文件路径,先确认这三项符合预期
- 请求类日志按时间递增,出现连续错误行说明故障正在持续,而间歇错误要配合时间戳与监控对照
- 退出前最后几行最关键,异常栈、端口占用、数据库连不上都会在这里体现
- 健康检查失败会以独立日志出现,别把它当成应用自身报错
需要长期留存时把日志采集到外部系统:容器被删除、宿主被重建、日志被轮转删除都会让现场消失,事故复盘往往就差那段时间的输出。
日志不输出怎么查
| 现象 | 可能原因 | 处理办法 |
|---|---|---|
| 日志完全为空 | 日志驱动被设为丢弃,或应用把日志写进了文件 | 先确认驱动类型,再进容器查找落盘的日志文件 |
| 只有前半段没有后半段 | 主进程崩溃或被强杀,缓冲区内容没来得及刷出 | 关闭输出缓冲,并检查内存上限与退出码 |
| 时间戳与本地时间差很多 | 容器时区为默认的协调世界时 | 给容器设置时区变量或挂载本地时间配置 |
| 命令报不支持读取 | 使用了不提供读取能力的日志驱动 | 改用本地文件类驱动,或把日志输出到外部采集端 |
| 日志延迟很久才出现 | 应用输出带缓冲 | 关闭缓冲,或在应用配置里开启行级刷新 |
日志量的治理
- 单容器限制大小与份数,避免一个刷屏的服务吃掉整块磁盘
- 在守护进程层面设默认值,新容器自动继承,省得逐个加参数
- 把关键日志采集到集中平台,本机只保留最近一段窗口
- 区分访问日志与错误日志的保留策略,错误日志留存更久
- 排查结束后回归默认策略,别让临时的大保留量长期留在生产