Docker logs 标准输出/错误日志查看和管理
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 输入
- 导航到“System” > “Inputs”
- 在左侧菜单中选择 System,然后点击 Inputs。
- 选择 GELF 输入类型
- 在“Select input”下拉菜单中,找到并选择 GELF UDP 或 GELF TCP。
- GELF UDP:适用于大多数场景,性能较好,但不保证消息传递。
- GELF TCP:提供可靠的消息传递,适合对日志完整性要求较高的环境。
- 在“Select input”下拉菜单中,找到并选择 GELF UDP 或 GELF TCP。
- 配置 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 |
空闲连接超时时间 |
- 保存输入
- 点击 Launch new input 按钮启动输入。
步骤 3:验证输入是否正常工作
- 回到 Inputs 页面,您应该能看到新创建的 GELF 输入正在运行。
- 查看 Metrics 或 Show 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-app
或 gl2_source_input:"Docker GELF Input"
来定位日志。
常见问题排查
问题 | 解决方案 |
---|---|
日志未到达 Graylog | 检查防火墙、端口是否开放;确认 gelf-address 正确 |
UDP 丢包严重 | 改用 GELF TCP;增加网络带宽或优化日志频率 |
日志字段缺失 | 确保应用输出的是标准 GELF 格式日志 |
TLS 连接失败 | 检查证书配置、CA 信任链 |
高级配置建议
- 启用压缩:Docker 默认使用
gzip
压缩 GELF 消息,Graylog 会自动解压。 - 添加自定义字段:在
logging.options
中使用labels
或env
添加上下文信息。 - 集中管理:结合 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 禁用日志记录
重要提示
- 优先级:Compose 文件中的日志配置会覆盖 daemon.json 的全局设置,但不会被 docker run 命令行参数覆盖(因为 Compose 本身生成运行命令)。
- 版本要求:确保您的 docker-compose.yml 文件版本至少为 3 或更高。
- 选项差异:不同日志驱动支持的 options 不同,请参考官方文档。
- 查看日志:即使配置了日志驱动,您仍然可以使用 docker-compose logs [service] 命令查看日志输出。
通过在 Compose 文件中配置日志,您可以实现环境间的一致性,并将日志策略作为代码进行版本控制和管理。
https://www.syntaxspace.com/article/2508221628407236.html
评论