环境:
Ubuntu20.04
问题描述:
Ubuntu系统rsyslog日志突然占用磁盘空间超大怎么办?最高200G
解决方案:
方案1:
1.检查是什么产生的
sudo tail -n 1000 /var/log/syslog
2.先手动清空日志释放空间
sudo truncate -s 0 /var/log/syslog
3.查看cat /etc/logrotate.d/rsyslog配置
(base) root@VM-0-2-ubuntu:/mnt/program/elk/docker-elk# cat /etc/logrotate.d/rsyslog
/var/log/syslog
{
rotate 7
daily
missingok
notifempty
delaycompress
compress
postrotate
/usr/lib/rsyslog/rsyslog-rotate
endscript
}
/var/log/mail.info
/var/log/mail.warn
/var/log/mail.err
/var/log/mail.log
/var/log/daemon.log
/var/log/kern.log
/var/log/auth.log
/var/log/user.log
/var/log/lpr.log
/var/log/cron.log
/var/log/debug
/var/log/messages
{
rotate 4
weekly
missingok
notifempty
compress
delaycompress
sharedscripts
postrotate
/usr/lib/rsyslog/rsyslog-rotate
endscript
}
4.设置策略
您想实现的是:让系统的日志文件(如 /var/log/syslog
)总大小控制在固定阈值(例如 10G)以内,超过后自动清理或循环覆盖旧日志,避免日志无限增长占满磁盘空间。
Linux 下常用的日志管理手段是 logrotate 配合日志轮转,但 logrotate 本身不支持按照总大小限制删除旧日志,它是基于日期轮转(daily/weekly)和备份份数(rotate X)来控制日志量。
方案2:利用 logrotate,实现基于文件个数和单个文件大小的限制
- logrotate 可以配置单个日志文件轮转的最大大小(
maxsize
或size
),当日志超过该大小时执行轮转 - 结合
rotate
参数限制保留的旧日志个数,间接控制总日志大小
示例 /etc/logrotate.d/syslog
配置:
/var/log/syslog {
size 100M # 当日志文件大于100MB时,轮转日志
rotate 100 # 保留最大100个轮转文件
missingok
notifempty
compress
delaycompress
copytruncate
}
- 100个文件 × 100MB = 10GB 左右的总日志大小
copytruncate
适用于不能重启日志写入进程的情况(如 rsyslog)- 缺点:不能严格保证总大小恰好10G,日志大小会有波动
方案3:使用 maxsize
配合 daily
和 rotate
控制
/var/log/syslog {
daily
maxsize 100M # 当日志超过100MB时轮转
rotate 100 # 保留100个轮转文件
missingok
notifempty
compress
delaycompress
copytruncate
}
- 轮转时间触发和大小触发二者任一满足即可轮转
- 仍是间接控制总文件大小
方案4:使用专门的日志管理工具 — logrotate
结合 systemd-journald
如果您的系统用的是 systemd
,推荐使用 journald
管理日志,支持直接配置最大磁盘使用量
查看 journald
配置文件 /etc/systemd/journald.conf
- 关键参数:
SystemMaxUse=10G # 日志最大占用磁盘空间,超过自动清理旧日志
RuntimeMaxUse=10G # 运行时日志最大占用空间
MaxRetentionSec=2week # 日志最长保留时间
修改后重启 systemd-journald
:
sudo systemctl restart systemd-journald
这样journald 会自动控制日志文件大小,删除旧记录,避免占用超过10G。
方案5:对 Docker 容器日志限制大小
如果是 Docker 容器产生的大量日志,也要限制容器日志大小:
Docker Compose 配置示例(限制单个日志文件最大10M,最多3个轮转文件):
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
方案总结
方案编号 | 方案名称 | 适用场景 | 是否严格控制总大小 | 配置复杂度 |
---|---|---|---|---|
1 | logrotate size + rotate | 传统日志文件管理 | 间接控制 | 简单 |
2 | logrotate maxsize + daily | 传统日志文件管理 | 间接控制 | 简单 |
3 | systemd-journald 配置 | systemd 系统日志管理 | 严格控制 | 简单 |
4 | Docker 容器日志限制 | Docker 容器日志管理 | 严格控制 | 简单 |
操作示例
修改 /etc/logrotate.d/rsyslog
,添加 size 和 rotate
/var/log/syslog
{
size 100M
rotate 100
missingok
notifempty
compress
delaycompress
copytruncate
postrotate
/usr/lib/rsyslog/rsyslog-rotate
endscript
}
执行强制轮转测试:
sudo logrotate -f /etc/logrotate.d/rsyslog
修改 /etc/systemd/journald.conf
(本案例选这个)
编辑配置:
sudo nano /etc/systemd/journald.conf
找到并设置:
SystemMaxUse=10G
RuntimeMaxUse=10G
MaxRetentionSec=2week
保存后重启服务:
sudo systemctl restart systemd-journald
备注
copytruncate
用于避免日志写入程序重启,适合 rsyslog- 如果您使用的是 journald 作为主要日志管理工具,建议以 journald 配置为主
- 对于 Docker 产生的日志,请务必设置日志最大大小和轮转,避免单个日志文件无限制膨胀