docker logs 查看日志
面试题
如何查看 Docker 容器的日志?docker logs 有哪些常用参数和配置?
标准答案
docker logs 是查看容器日志的核心命令,它获取的是容器内主进程的 stdout(标准输出)和 stderr(标准错误)输出。对于没有日志文件的场景尤为关键。
基本用法
# 查看全部日志
docker logs my-container
# 实时跟踪日志(类似 tail -f)
docker logs -f my-container
# 查看尾部 N 行
docker logs --tail 100 my-container
# 查看最近时间段的日志
docker logs --since 2024-01-01T10:00:00 my-container
docker logs --since 5m my-container # 最近 5 分钟
docker logs --since 1h --until 30m ago my-container
# 加上时间戳
docker logs -t my-container
# 组合参数(最常用)
docker logs -f --tail 50 my-container
常用参数详解
| 参数 | 作用 | 示例 |
|---|---|---|
-f / --follow |
实时跟踪输出 | logs -f nginx |
-t / --timestamps |
显示时间戳 | logs -t nginx |
--tail |
只显示末尾 N 行 | logs --tail 200 nginx |
--since |
显示指定时间后的日志 | logs --since 2024-01-01 |
--until |
显示指定时间前的日志 | logs --until 2024-02-01 |
-n |
--tail 的别名 |
logs -n 100 nginx |
日志驱动程序
Docker 支持多种日志驱动,默认是 json-file,但生产中通常会配置其他驱动。
# 查看当前日志驱动
docker info | grep "Logging Driver"
# 启动容器时指定日志驱动
docker run -d --log-driver json-file --log-opt max-size=10m --log-opt max-file=3 nginx
常见日志驱动
| 驱动 | 说明 | 适用场景 |
|---|---|---|
json-file |
默认,写入 JSON 文件 | 单机开发测试 |
journald |
写入 systemd journal | systemd 集成环境 |
syslog |
发送到 syslog 服务 | 集中日志收集 |
fluentd |
发送到 Fluentd | 日志管道 |
awslogs |
发送到 CloudWatch | AWS 环境 |
gelf |
Graylog Extended Log Format | Graylog 集成 |
splunk |
发送到 Splunk HTTP Collector | Splunk 用户 |
none |
禁用日志 | 性能敏感场景 |
日志配置最佳实践
# docker-compose.yml 生产配置
services:
nginx:
image: nginx:alpine
logging:
driver: json-file
options:
max-size: "10m" # 每个日志文件最大 10MB
max-file: "3" # 保留最近 3 个文件
compress: "true" # 轮转时压缩
# 全局默认日志配置(daemon.json)
# /etc/docker/daemon.json
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3",
"compress": "true"
}
}
常见问题与解决方案
Q:日志占用磁盘太多怎么办?
# 方式一:配置日志轮转(推荐)
--log-opt max-size=10m --log-opt max-file=3
# 方式二:全局清理
# 删除所有已退出容器的日志
docker container prune -f
docker system prune -f
# 方式三:手动清理特定容器的日志
truncate -s 0 $(docker inspect --format='{{.LogPath}}' container_name)
Q:容器没有日志输出?
# 确认应用是否写到了 stdout/stderr
# 很多应用默认写文件日志,需要配置为输出到控制台
# 在 Dockerfile 中做软链接
RUN ln -sf /dev/stdout /var/log/nginx/access.log \
&& ln -sf /dev/stderr /var/log/nginx/error.log
Q:如何查看已停止容器的日志?
# 已停止容器的日志仍然可以查看
docker logs my-stopped-container
# 前提是启动时使用了 json-file 驱动且容器还没被 rm 掉
Q:日志驱动不支持 docker logs 怎么办?
如果使用了非 json-file、journald 或 gelf 等驱动,docker logs 可能不可用。此时需要通过外部日志系统查看。
与其他调试命令配合
# 先看日志,再 exec 排查
docker logs -f --tail 100 myapp
# 看到错误后进入容器
docker exec -it myapp bash
总结
docker logs 是容器排障的第一道关卡,核心掌握 -f(跟踪)、--tail(尾行数)、--since(时间过滤)三个参数。生产环境务必配置日志轮转(max-size + max-file),避免日志撑爆磁盘。最佳实践是让应用将日志输出到 stdout/stderr,而非写入文件。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END


暂无评论内容