docker logs 查看日志

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-filejournaldgelf 等驱动,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
喜欢就支持一下吧
点赞13 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容