在Linux系统中运行容器服务时,容器产生的日志如果缺乏规范管理,很容易出现磁盘空间被占满、历史日志难以追溯等问题。合理的容器日志配置需要结合容器运行时特性、系统日志工具和轮转策略共同实现。

容器日志的默认机制
以Docker为例,默认情况下容器使用json-file日志驱动,日志会存储在/var/lib/docker/containers/容器ID/目录下的容器ID-json.log文件中。这种默认方式虽然开箱即用,但存在两个明显问题:一是日志不会自动轮转,长期运行会不断占用磁盘空间;二是日志分散在各个容器目录下,不便于统一查询和管理。
我们可以通过docker inspect 容器名命令查看当前容器的日志配置,示例输出中LogConfig部分就是日志相关配置:
# 查看容器日志配置 docker inspect test_container | grep -A 10 "LogConfig"
修改Docker守护进程配置调整日志驱动
要全局调整容器的日志规则,需要修改Docker的守护进程配置文件/etc/docker/daemon.json,如果文件不存在可以直接创建。我们可以配置日志驱动为json-file的同时设置轮转参数,也可以切换到syslog驱动将日志接入系统日志服务。
配置json-file驱动并开启基础轮转
在daemon.json中添加如下配置,限制单个日志文件大小为10MB,最多保留3个轮转文件:
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}
修改完成后需要重启Docker服务让配置生效:
# 重启Docker服务 systemctl restart docker
切换为syslog驱动接入系统日志
如果需要将容器日志统一接入Linux系统的rsyslog服务,可以将日志驱动改为syslog,配置如下:
{
"log-driver": "syslog",
"log-opts": {
"syslog-address": "udp://127.0.0.1:514",
"tag": "docker_container"
}
}
这里的syslog-address指定rsyslog的监听地址,tag是给容器日志添加的标识,方便后续过滤查询。
结合rsyslog实现日志集中管理
rsyslog是Linux系统默认的日志服务,我们可以配置它接收容器发来的日志,并按规则存储到指定路径。首先确保rsyslog服务正常运行:
# 检查rsyslog状态 systemctl status rsyslog # 如果未运行则启动 systemctl start rsyslog
然后编辑rsyslog配置文件/etc/rsyslog.conf,开启UDP 514端口监听,去掉下面两行的注释:
# 开启UDP监听 module(load="imudp") input(type="imudp" port="514")
接着在/etc/rsyslog.d/目录下创建docker.conf文件,添加容器日志的过滤和存储规则:
# 匹配tag为docker_container的日志,存储到指定文件 if $programname == "docker_container" then /var/log/docker/containers.log # 停止后续处理,避免重复记录 & stop
重启rsyslog服务让配置生效:
systemctl restart rsyslog
使用logrotate设置日志自动轮转
即使Docker配置了基础轮转,或者日志接入了rsyslog,我们仍然需要使用logrotate做更精细的轮转管理,比如按天轮转、压缩历史日志、轮转后自动重启服务等。首先在/etc/logrotate.d/目录下创建docker-logs配置文件:
/var/log/docker/containers.log {
daily # 按天轮转
rotate 7 # 保留7个历史文件
compress # 压缩轮转后的文件
delaycompress # 延迟压缩上一个轮转文件
missingok # 文件不存在也不报错
notifempty # 空文件不轮转
create 0644 root root # 新建文件权限和属主
postrotate # 轮转后执行的操作
systemctl restart rsyslog > /dev/null 2>&1 || true
endscript
}
我们可以手动测试logrotate配置是否生效:
# 强制轮转测试 logrotate -vf /etc/logrotate.d/docker-logs
单个容器的日志配置
如果只需要对某个特定容器做日志配置,不需要修改全局Docker配置,可以在运行容器时通过参数指定:
# 运行容器时指定日志驱动和轮转参数 docker run -d --log-driver json-file --log-opt max-size=20m --log-opt max-file=5 --name test_app nginx:latest
常见问题排查
- 如果修改Docker配置后不生效,检查
daemon.json格式是否正确,JSON格式错误会导致Docker启动失败,可以通过systemctl status docker查看错误信息。 - 如果rsyslog收不到容器日志,检查防火墙是否放行了514端口,同时确认Docker配置的
syslog-address和rsyslog监听的地址端口一致。 - 如果logrotate没有按时轮转日志,检查
/etc/cron.daily/logrotate任务是否正常执行,也可以查看/var/lib/logrotate/status文件确认轮转记录。
注意:如果使用的是其他容器运行时比如Containerd,日志配置方式和Docker略有不同,但核心思路都是调整运行时日志驱动、接入系统日志服务、配置自动轮转三个环节。
Dockercontainer_logrsysloglogrotate修改时间:2026-07-05 17:24:27