正确做法是用 logrotate 实现安全轮转 + 自动清理,按大小触发(如 size 100M)、保留 14 次归档、启用 dateext 和 delaycompress,并配合 journald.conf 限制日志总量与保留时长。

linux 日志太大,直接删文件风险高、易中断服务,正确做法是用 logrotate 实现安全轮转 + 自动清理。它不删除当前日志,而是按规则归档、压缩、过期清除,兼顾可追溯性与磁盘空间。
确认 logrotate 已就位并了解默认行为
主流发行版(ubuntu/centos/RHEL)都预装 logrotate。运行以下命令验证:
- logrotate –version 查看版本
- ls /etc/logrotate.conf /etc/logrotate.d/ 确认主配置和应用配置目录存在
- cat /etc/cron.daily/logrotate 查看系统是否已通过 cron 每天自动执行(默认路径,多数系统启用)
注意:logrotate 默认读取 /etc/logrotate.conf,再自动包含 /etc/logrotate.d/ 下所有文件。无需手动启动服务,靠 cron 触发即可。
针对大日志快速生效的实用配置项
不要只依赖全局 weekly 或 rotate 4。对增长快的服务(如 nginx 访问日志、自研应用日志),推荐按大小触发 + 保留合理天数:
- size 100M:当日志单个文件超过 100MB 就立即轮转(比 daily 更及时)
- rotate 14:保留最近 14 个归档(不是 14 天,是 14 次轮转;若每天一次,即约两周)
- dateext:归档文件带日期后缀(如 access.log-20251218),比数字序号更直观易查
- compress & delaycompress:压缩节省空间,delaycompress 避免刚轮转的日志被立刻压缩,方便紧急查看
- missingok & notifempty:防止因日志路径不存在或为空导致轮转失败报错
示例(保存为 /etc/logrotate.d/nginx-large):
/var/log/nginx/*.log {size 100M rotate 14 dateext compress delaycompress missingok notifempty create 0644 www-data www-data }
立即验证与强制执行,避免等明天
改完配置别干等 cron,用调试和强制模式快速验证效果:
- logrotate -d /etc/logrotate.d/nginx-large:仅模拟执行,显示每步操作但不真实改动(检查路径、权限、条件是否匹配)
- logrotate -f /etc/logrotate.d/nginx-large:强制立即轮转,适用于日志已爆满需马上释放空间
- ls -lt /var/log/nginx/*.gz /var/log/nginx/*-2025*:确认新归档是否生成、压缩是否生效
配合 systemd-journald 控制二进制日志膨胀
如果系统启用了 journald(默认开启),/run/log/journal/ 或 /var/log/journal/ 可能悄悄占几十 GB。仅配 logrotate 不管用,需单独限制:
- 编辑 /etc/systemd/journald.conf,取消注释并设值:
- SystemMaxUse=500M(总占用上限)
- MaxRetentionSec=7d(最多保留 7 天)
- 重启生效:sudo systemctl restart systemd-journald
- 立即清理:sudo journalctl –vacuum-size=500M 或 journalctl –vacuum-time=7d