Docker logs 标准输出/错误日志查看和管理

编程教程 > Docker Case (84) 2025-08-22 16:56:14

docker logs 是 Docker 提供的一个命令行工具,用于查看容器的 stdout/stderr 输出日志。

以下是一些常用的 docker logs 命令和日志管理的最佳实践

基本用法

# 查看指定容器的日志
docker logs <container_id_or_name>

# 实时查看日志(类似 tail -f)
docker logs -f <container_id_or_name>

# 显示最近的n条日志
docker logs --tail n <container_id_or_name>

# 显示指定时间之后的日志
docker logs --since "2023-01-01T12:00:00" <container_id_or_name>

# 显示指定时间范围内的日志
docker logs --since "2023-01-01T12:00:00" --until "2023-01-01T13:00:00" <container_id_or_name>

# 显示带时间戳的日志
docker logs -t <container_id_or_name>

 

Docker 容器的日志默认存储位置

/var/lib/docker/containers/<container-id>/<container-id>-json.log

这是一个 JSON 格式的文件,记录了容器 stdout/stderr 的所有输出。

🔍 你可以用 docker inspect <container> 查看日志路径,搜索 "LogPath" 字段。

docker ps 显示的是容器ID前12位

⏳ 日志保留时间:默认无限期,但可能被大小限制

Docker 不会自动按时间删除日志,但可以通过配置限制日志大小和文件数量,否则日志可能无限增长,占满磁盘。

日志驱动(Log Drivers)

Docker 支持多种日志驱动,可以在启动容器时通过 --log-driver 指定:

# 使用 json-file 驱动(默认)
docker run --log-driver=json-file --log-opt max-size=10m --log-opt max-file=3 your_image

# 使用 syslog 驱动
docker run --log-driver=syslog --log-opt syslog-address=tcp://192.168.0.42:514 your_image

# 使用 fluentd 驱动
docker run --log-driver=fluentd --log-opt fluentd-address=127.0.0.1:24224 your_image

# 使用 awslogs 驱动(发送到 AWS CloudWatch)
docker run --log-driver=awslogs --log-opt awslogs-region=us-west-2 --log-opt awslogs-group=my-log-group your_image

日志轮转和限制

为了防止日志文件占用过多磁盘空间,建议配置日志轮转:

# 在 docker run 时设置


docker run \
  --log-driver=json-file \
  --log-opt max-size=10m \
  --log-opt max-file=5 \
  your_image

# 或在 daemon.json 中全局设置

{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3"
  }
}

使用 Docker Compose 配置

version: '3'
services:
  app:
    image: your_app
    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "3"

当您在 Docker 中配置日志驱动时,docker run 命令行选项优先于 /etc/docker/daemon.json 文件中的设置。这意味着如果您在运行容器时通过 docker run 使用了 --log-driver 参数来指定日志驱动(例如 json-file),那么这个设置将会覆盖在 daemon.json 中为 Docker 守护进程全局设定的日志驱动配置。

 

Docker Compose 配置详解

基本语法

 

version: '3'
services:
  your_service_name:
    image: your_image
    logging:
      driver: "json-file"  # 指定日志驱动
      options:
        max-size: "10m"    # 日志文件最大大小
        max-file: "3"      # 保留的日志文件数量
        # 其他选项...

示例:使用 json-file 驱动

 

version: '3.8'
services:
  web:
    image: nginx:latest
    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "5"
        # 可选:添加时间戳
        # labels: "env,service"
        # env: "os,platform"

示例:使用 syslog 驱动

 

version: '3.8'
services:
  app:
    image: your_app_image
    logging:
      driver: "syslog"
      options:
        syslog-address: "tcp://192.168.0.10:514"
        syslog-facility: "local7"
        tag: "myapp"

示例:使用 fluentd 驱动

 

version: '3.8'
services:
  backend:
    image: your_backend_image
    logging:
      driver: "fluentd"
      options:
        fluentd-address: "127.0.0.1:24224"
        fluentd-async-connect: "true"
        tag: "service.backend"

示例:使用 AWS CloudWatch Logs

version: '3.8'
services:
  api:
    image: your_api_image
    logging:
      driver: "awslogs"
      options:
        awslogs-region: "us-west-2"
        awslogs-group: "my-log-group"
        awslogs-stream: "api-service"

 

示例:使用 Graylog 驱动

GELF 日志驱动

version: '3.8'
services:
  app:
    image: your_application_image
    logging:
      driver: "gelf"
      options:
        gelf-address: "udp://your_graylog_server_ip:12201"  # Graylog 服务器的地址和端口
        tag: "your_service_name"                            # 可选:为日志消息添加标签
        env: "prod,web"                                     # 可选:将环境变量包含在日志中
        # 添加其他选项...

要在 Graylog 中设置 GELF 输入插件以接收来自 Docker 容器的日志,您可以按照以下步骤进行操作。GELF (Graylog Extended Log Format) 是一种高效的日志格式,支持结构化数据和压缩。

步骤 1:登录 Graylog Web 界面

首先,打开浏览器并访问您的 Graylog 服务器的 Web 界面(通常是 http://<graylog-server-ip>:9000),然后使用管理员账户登录。

步骤 2:创建 GELF 输入

  1. 导航到“System” > “Inputs”
    • 在左侧菜单中选择 System,然后点击 Inputs
  2. 选择 GELF 输入类型
    • 在“Select input”下拉菜单中,找到并选择 GELF UDPGELF TCP
      • GELF UDP:适用于大多数场景,性能较好,但不保证消息传递。
      • GELF TCP:提供可靠的消息传递,适合对日志完整性要求较高的环境。
  3. 配置 GELF 输入参数
示例:GELF UDP 输入配置
参数 建议值 说明
Title Docker GELF Input 输入的名称,便于识别
Bind address 0.0.0.0 监听所有网络接口(或指定特定 IP)
Port 12201 默认 GELF 端口
Decompress size limit 8192 KB 解压后消息的最大大小(单位:KB)
Override source (可选)docker-host 覆盖日志来源主机名
Recv buffer size 262144 接收缓冲区大小(字节)

提示:确保防火墙允许该端口的入站流量(如 12201/udp)。

示例:GELF TCP 输入配置
参数 建议值 说明
Title Docker GELF TCP Input 输入名称
Bind address 0.0.0.0 绑定地址
Port 12201 端口号
TLS/SSL (可选)启用 启用加密传输(需配置证书)
Max concurrent connections 1000 最大并发连接数
Idle connection timeout 5000 ms 空闲连接超时时间
  1. 保存输入
    • 点击 Launch new input 按钮启动输入。

步骤 3:验证输入是否正常工作

  • 回到 Inputs 页面,您应该能看到新创建的 GELF 输入正在运行。
  • 查看 MetricsShow received messages 可以实时查看是否有日志流入。

步骤 4:配置 Docker 使用 GELF 发送日志

确保您的 Docker 容器配置了正确的日志驱动,指向 Graylog 服务器:

yaml

深色版本
# docker-compose.yml
version: '3.8'
services:
  app:
    image: nginx:alpine
    logging:
      driver: "gelf"
      options:
        gelf-address: "udp://<graylog-server-ip>:12201"
        tag: "web-app"
        env: "production"

替换 <graylog-server-ip> 为实际的 Graylog 服务器 IP 地址。

步骤 5:测试日志流

启动容器后,在 Graylog 的 Search 页面中查看是否有来自 web-app 的日志出现。您可以通过过滤 source:web-appgl2_source_input:"Docker GELF Input" 来定位日志。


常见问题排查

问题 解决方案
日志未到达 Graylog 检查防火墙、端口是否开放;确认 gelf-address 正确
UDP 丢包严重 改用 GELF TCP;增加网络带宽或优化日志频率
日志字段缺失 确保应用输出的是标准 GELF 格式日志
TLS 连接失败 检查证书配置、CA 信任链

高级配置建议

  • 启用压缩:Docker 默认使用 gzip 压缩 GELF 消息,Graylog 会自动解压。
  • 添加自定义字段:在 logging.options 中使用 labelsenv 添加上下文信息。
  • 集中管理:结合 Fluentd 或 Filebeat 作为中间代理,实现更复杂的日志处理逻辑。

完成以上步骤后,您的 Graylog 服务器就可以成功接收并处理来自 Docker 容器的 GELF 格式日志了。

 

示例:禁用日志记录

version: '3.8'
services:
  worker:
    image: your_worker_image
    logging:
      driver: "none"  # 完全禁用日志记录

支持的常用日志驱动

  • json-file    默认驱动,将日志写入 JSON 格式文件
  • syslog    将日志发送到 syslog 服务器
  • journald    使用 systemd journal 记录日志
  • gelf    Graylog Extended Log Format
  • fluentd    将日志发送到 Fluentd
  • awslogs    发送到 Amazon CloudWatch Logs
  • splunk    发送到 Splunk
  • none    禁用日志记录

重要提示

  1. 优先级:Compose 文件中的日志配置会覆盖 daemon.json 的全局设置,但不会被 docker run 命令行参数覆盖(因为 Compose 本身生成运行命令)。
  2. 版本要求:确保您的 docker-compose.yml 文件版本至少为 3 或更高。
  3. 选项差异:不同日志驱动支持的 options 不同,请参考官方文档。
  4. 查看日志:即使配置了日志驱动,您仍然可以使用 docker-compose logs [service] 命令查看日志输出。

通过在 Compose 文件中配置日志,您可以实现环境间的一致性,并将日志策略作为代码进行版本控制和管理。

 


评论
User Image
提示:请评论与当前内容相关的回复,广告、推广或无关内容将被删除。

相关文章
docker logs 是 Docker 提供的一个命令行工具,用于查看容器的 stdout/stderr 输出日志。以下是一些常用的 docker logs
Nginx 配置日志nginx默认的日志配置在nginx.conf配置文件。
docker 常用命令整理(持续更新)docker运行容器资源相关查看所有运行docker的资源消耗情况docker stats查看指定运行容器资源消耗情况do
直接查看多少行日志sudo docker logs -f -t --tail 行数 容器名滚动日志sudo docker logs -f -t --tail -f 容器名​​​​​​​代码段 小部件
mysql 查看日志是否开启日志存放路径
Docker 默认工作目录是/var/lib/docker ,某些情况下不够用需要迁移到新的磁盘,非系统盘。则参考下面迁移办法Docker 工作目录相关查看do
执行方案使用crontab + shell脚本方式,每天定时分隔access.log和error.log,防止文件过大带来的问题。 nginx 日志分隔脚本ng
查看网络列表docker network ls删除某个网络docker network remove 网络名称查看网络详情docker network insp
Docker从容器复制文件到主机sudo docker cp 容器名称/容器id:容器文件/目录 主机目录示例:sudo docker cp nginx:/et
在执行多次docker-compose build 之后,我们通过命令`docker images`可以看到很多的REPOSITORY 为&lt;none&gtl; 且tag 也是&lt;non...
旧域名:https://hub.docker.com 新域名:https://hubgw.docker.com/
一. Docker-Compose 简介1. Docker-Compose 简介Docker-Compose项目是Docker官方的开源项目,负责实现对Docker容器集群的快速编排。Docke...
Docker简介Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可
环境准备docker swarm 集群环境NFS服务资源文件docker-mutil-stack.zip(访问密码: 9987)1.创建overlay网络网络名称:stackMutilNetwo...
前置条件安装部署好graylog server创建graylog input 打开System/Inputs菜单选择输入类型为filebeat进行创建input创建inputinput信息配置i...