文章目录
- 一、容器日志工具docker logs
- 1、常用选项:
- 2、常用日志查看命令
- 2.1 跟随日志输出
- 2.2 显示带时间戳的日志
- 2.3 从指定时间开始显示日志
- 2.4 显示最后 10 行日志
- 2.5 显示额外详细信息的日志
- 2.6 显示直到指定时间的日志
- 二、容器日志驱动
- 1、日志驱动类型
- 2、配置默认的日志驱动
- 3、查看当前默认的日志驱动
- 4、配置容器的日志驱动
- 三、容器日志清理
- 1、手动清理运行容器的日志
- 2、运行容器时设置轮转策略(推荐)
- 1、设置缺省的轮转策略
- 2、运行容器时设置轮转策略
- 四、最佳实践
某日运维反馈某个容器应用出现异常,主要表现为数据写入功能失效。初步排查时,使用
docker logs
查看容器日志未发现明显报错。随后通过 df -h
检查服务器磁盘状态,发现磁盘占用已达100%
。进一步使用 du
命令分析,定位到 docker/volumes
目录占用了数十GB
空间,其中容器日志文件是主要成因。通过删除并重建容器,成功释放磁盘空间,应用功能随即恢复正常。
这次事故暴露出容器日志管理的重要性。本文将系统梳理Docker日志
的收集、轮转和清理方案,帮助读者避免同类问题。主要内容包括:Docker日志
的存储机制、日志轮转配置方法、清理方案、最佳实践建议。
一、容器日志工具docker logs
Docker
自带的docker logs命令
输出正在运行的容器的日志信息,而docker service logs
命令显示服务中的所有容器的日志信息(这个命令适用于集群环境)。
1、常用选项:
• -f
, --follow
: 跟随日志输出(类似于 tail -f
)。
• --since
: 从指定时间开始显示日志。
• -t
, --timestamps
: 显示日志时间戳。
• --tail
: 仅显示日志的最后部分,例如 --tail 10
显示最后 10 行。
• --details
: 显示提供给日志的额外详细信息。
• --until
: 显示直到指定时间的日志。
2、常用日志查看命令
2.1 跟随日志输出
docker logs -f my_container
输出内容:
hello world
hello world
hello world
2.2 显示带时间戳的日志
显示包含时间戳的日志
docker logs -t my_container
输出内容:
2023-07-22T15:04:05.123456789Z hello world
2023-07-22T15:04:06.123456789Z hello world
2023-07-22T15:04:07.123456789Z hello world
2.3 从指定时间开始显示日志
显示 2023-07-22T15:00:00 之后的日志。
docker logs --since="2023-07-22T15:00:00" my_container
2.4 显示最后 10 行日志
显示 my_container
的最后 10 行日志。
docker logs --tail 10 my_container
2.5 显示额外详细信息的日志
显示 my_container
的日志,并包含额外详细信息。
docker logs --details my_container
2.6 显示直到指定时间的日志
显示 2023-07-22T16:00:00 之前的日志。
docker logs --until="2023-07-22T16:00:00" my_container
二、容器日志驱动
1、日志驱动类型
Docker
默认的日志驱动是json-file
。在启动容器时可以通过--log-driver
选项配置日志驱动。
选项值 | 说明 |
---|---|
none | 禁用容器日志,docker logs 命令不会输出任何日志信息 |
json-file | Docker默认的日志驱动。该驱动将日志保存在JSON文件中,Docker 负责格式化其内容并输出到STDOUT和STDERR |
syslog | 将日志信息写入syslog日志系统,syslog守护进程必须在主机上运行 |
journald | 将日志信息写入joumald 日志系统,joumald 守护进程必须在主机上运行 |
gelf | 将日志信息写入像Graylog 或 Logstash这样的GELF(Graylog Extended Log Format)终端 |
fluentd | 将日志信息写入fluentd, fuentd守护进程必须在主机上运行 |
splunk | splunk 将日志信息写入使用 HTTP 事件搜集器的 splunk |
使用Docker CE
时,docker logs 命令
只能用于local
、json-file
和journald
日志驱动。
2、配置默认的日志驱动
将daemon.json文件
(Linux
主机中一般位于/etc/docker目录
,Windows
中一般位于C:ProgramData\Docker\config
)中的log-driver
值设为日志驱动名称即可配置驱动。
# 默认的日志驱动是json-file, 下面实例将其设置为syslog
{
"log-driver":"syslog"
}
如果日志驱动有可配置的选项,则可以在daemon.json
文件的关键字log-opts
中以JSON
格式设置。
# 为json-file日志驱动设置了四个可配置选项
{
"log-driver":"json-file",
"log-opts":{
"labels":"production_status",
"env":"os,customer",
"max-size": "10m",
"max-file": "5"
}
}
# 默认驱动就是json-file,因此使用docker inspect命令之类的默认输出就是JSON格式
3、查看当前默认的日志驱动
docker info | grep 'Logging Driver'
4、配置容器的日志驱动
启动容器时,通过--log-driver
选项将其匹配成与Docker
守护进程使用不同的日志驱动。如果日志驱动有可配置选项,则可通过一个或多个选项(--log-opt<名称>=<值>
)进行设置。
docker run -d \
--name myapp \
--log-driver json-file \
--log-opt max-size=10m \
--log-opt max-file=3 \
myapp:latest
三、容器日志清理
Docker
默认使用的是 json-file 日志驱动
。日志会一直写,一直写,一直写……没有限制、没有轮转、没有清理!
日志默认位置:/var/lib/docker/containers//-json.log
1、手动清理运行容器的日志
容器的日志文件会占据大量的磁盘空间。在Linux
中,容器日志一般放在/var/lib/docker/containers/container_id
目录下以josn.log
结尾的文件中。清空对应文件即可清理日志,以下是全集,但仅限于临时使用:
echo "" > $(docker inspect --format='{{.LogPath}}' <container-id>)
# 或者
find /var/lib/docker/containers -name *-json.log -exec truncate -s 0 {} \;
或者更稳一点:
docker stop 停掉容器
docker rm 删除容器
使用轮转参数重新 run容器
这里提供一个shell脚本
清理正在运行的容器的日志:
#!/bin/sh
log=$(find /var/lib/docker/containers/ -name *-json.log)
for log in $logs
do
echo "clean logs:$log"
cat /dev/null>$log
done
2、运行容器时设置轮转策略(推荐)
根本上解决日志占用空间问题–限制容器的日志大小上限。在deamon.json
配置文件中为Docker
守护进程设置日志驱动时,可通过log-opts
选项来限制日志大小的上限。
1、设置缺省的轮转策略
# 为json-file日志驱动设置了四个可配置选项
{
"log-driver":"json-file",
"log-opts":{
"labels":"production_status",
"env":"os,customer",
"max-size": "10m",
"max-file": "5"
}
}
2、运行容器时设置轮转策略
docker run -d \
--name myapp \
--log-driver json-file \
--log-opt max-size=10m \
--log-opt max-file=3 \
myapp:latest
四、最佳实践
• 用 json-file + max-size + max-file
• 修改 daemon.json
设置全局默认
• 老容器要么清理日志,要么重启带轮转参数根据不同场景推荐配置值。
场景 | 建议参数 |
---|---|
开发环境 | max-size=5,mmax-file=3 |
测试环境 | max-size=10mmax-file=5 |
生产环境 | max-size=50mmax-file=10 |
Docker 日志默认设置太坑,一定要手动配置!