Ubuntu系统rsyslog日志突然占用磁盘空间超大怎么办?

发布于:2025-05-29 ⋅ 阅读:(17) ⋅ 点赞:(0)

环境:

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 可以配置单个日志文件轮转的最大大小(maxsizesize),当日志超过该大小时执行轮转
  • 结合 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 配合 dailyrotate 控制

/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 产生的日志,请务必设置日志最大大小和轮转,避免单个日志文件无限制膨胀


网站公告

今日签到

点亮在社区的每一天
去签到