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>
/var/lib/docker/containers/<container-id>/<container-id>-json.log
这是一个 JSON 格式的文件,记录了容器 stdout/stderr 的所有输出。
🔍 你可以用
docker inspect <container>
查看日志路径,搜索"LogPath"
字段。docker ps 显示的是容器ID前12位
Docker 不会自动按时间删除日志,但可以通过配置限制日志大小和文件数量,否则日志可能无限增长,占满磁盘。
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 守护进程全局设定的日志驱动配置。
version: '3'
services:
your_service_name:
image: your_image
logging:
driver: "json-file" # 指定日志驱动
options:
max-size: "10m" # 日志文件最大大小
max-file: "3" # 保留的日志文件数量
# 其他选项...
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"
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"
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"
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"
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) 是一种高效的日志格式,支持结构化数据和压缩。
首先,打开浏览器并访问您的 Graylog 服务器的 Web 界面(通常是 http://<graylog-server-ip>:9000
),然后使用管理员账户登录。
参数 | 建议值 | 说明 |
---|---|---|
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
)。
参数 | 建议值 | 说明 |
---|---|---|
Title | Docker GELF TCP Input |
输入名称 |
Bind address | 0.0.0.0 |
绑定地址 |
Port | 12201 |
端口号 |
TLS/SSL | (可选)启用 | 启用加密传输(需配置证书) |
Max concurrent connections | 1000 |
最大并发连接数 |
Idle connection timeout | 5000 ms |
空闲连接超时时间 |
确保您的 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 地址。
启动容器后,在 Graylog 的 Search 页面中查看是否有来自 web-app
的日志出现。您可以通过过滤 source:web-app
或 gl2_source_input:"Docker GELF Input"
来定位日志。
问题 | 解决方案 |
---|---|
日志未到达 Graylog | 检查防火墙、端口是否开放;确认 gelf-address 正确 |
UDP 丢包严重 | 改用 GELF TCP;增加网络带宽或优化日志频率 |
日志字段缺失 | 确保应用输出的是标准 GELF 格式日志 |
TLS 连接失败 | 检查证书配置、CA 信任链 |
gzip
压缩 GELF 消息,Graylog 会自动解压。logging.options
中使用 labels
或 env
添加上下文信息。完成以上步骤后,您的 Graylog 服务器就可以成功接收并处理来自 Docker 容器的 GELF 格式日志了。
version: '3.8'
services:
worker:
image: your_worker_image
logging:
driver: "none" # 完全禁用日志记录
通过在 Compose 文件中配置日志,您可以实现环境间的一致性,并将日志策略作为代码进行版本控制和管理。
https://blog.xqlee.com/article/2508221628407236.html