linux中配置logrotate轮转系统日志应使用size参数替代daily等时间策略,并配合create、missingok、notifempty、compress、delaycompress及postrotate等关键参数确保可靠生效;需在/etc/logrotate.d/rsyslog或syslog中配置,通过logrotate -d和-f调试验证,再用rotate 7与maxage 30控制归档数量和生命周期。

Linux 中配置 Logrotate 轮转过大的系统日志,核心是用 size 参数替代时间策略(如 daily),并搭配关键配套指令确保轮转可靠生效。系统日志(如 /var/log/messages、/var/log/syslog)一旦写入突增,仅靠时间轮转极易导致单文件突破 10GB+,必须启用体积触发机制。
用 size 替代 daily/weekly 触发轮转
系统日志不可预测性强,时间策略无法应对突发流量。直接在配置中指定体积阈值,让 logrotate 在日志达到上限时立即切割:
- 将原配置中的
daily或weekly行删除或注释掉 - 添加
size 100M(单位不区分大小写,建议统一用大写 M/G/K) -
size是硬性触发条件:当前日志写满 100MB,logrotate 就重命名它(如messages → messages.1),再新建空的messages继续接收新日志 - 注意:
size与时间参数互斥;只要用了size,logrotate 就只看体积,不再检查日期
必须组合的关键参数才能真正起效
单独写 size 100M 不足以保证服务持续写入新文件,以下参数缺一不可:
-
create 0644 root root:轮转后新建日志文件,并设好权限和属主,否则服务可能因无写入权限失败 -
missingok和notifempty:避免因路径不存在或日志为空导致整个 logrotate 流程中断退出 -
compress+delaycompress:压缩旧日志节省空间,且延迟压缩可防止服务还在写.1文件时被 gzip 锁住 -
postrotate ... endscript:通知 syslog 服务重新打开日志文件。例如 rsyslog 用/usr/lib/rsyslog/rsyslog-rotate,systemd-journald 环境下通常不需要,但传统 syslog 必须加
配置位置与验证方法
系统日志规则一般在 /etc/logrotate.d/rsyslog(Debian/Ubuntu)或 /etc/logrotate.d/syslog(RHEL/CentOS)中。修改后不要等 cron:
- 先调试:运行
sudo logrotate -d /etc/logrotate.d/rsyslog,确认输出中包含 “rotating pattern” 和 “renaming” 等关键词,无报错 - 再强制执行一次:运行
sudo logrotate -f /etc/logrotate.d/rsyslog - 验证结果:检查
ls -lh /var/log/ | grep messages,应看到messages(小体积)、messages.1(刚轮转出的原始大小)、可能还有messages.1.gz(若已压缩) - 确认服务仍在写新日志:执行
tail -n 1 /var/log/messages,有实时输出即说明create和postrotate生效
防止单个归档无限膨胀的补充措施
即使启用了 size,仍需控制历史归档数量与生命周期:
-
rotate 7:最多保留 7 个轮转后的文件(messages.1到messages.7),超出自动删除最老的 -
maxage 30:归档文件存在超过 30 天就强制清理,与rotate独立判断,双重保险 - 慎用
copytruncate:仅适用于不支持重开日志句柄的服务;系统日志服务(rsyslog/syslog-ng)推荐用postrotate发信号,更安全可靠











