logrotate 通过 size 参数按大小触发日志轮转,如 size 50M 表示单文件达 50MB 立即切割;需配合 rotate、compress、copytruncate 等确保空间可控与服务不中断。

用 logrotate 限制单个日志文件最大体积,核心是启用 按大小触发轮转,而不是只依赖时间(如 daily)。关键配置项是 size,它能让日志一超过设定阈值就立即切割,避免单文件膨胀到几百 MB 甚至几 GB。
设置 size 参数控制单文件体积
size 是最直接有效的手段。只要当前日志文件大小达到指定值(例如 100M),logrotate 就会执行轮转,新建空日志继续写入。
常见写法:
-
size 5M→ 达到 5MB 就轮转 -
size 100M→ 达到 100MB 就轮转 -
size 2G→ 达到 2GB 才轮转(不推荐,风险高)
注意:size 和 daily / weekly 可共存——满足任一条件即触发,但 size 更及时,适合高频写入服务(如 Nginx、Java 应用、后台任务)。
配置示例(以 /var/log/myapp/app.log 为例)
创建文件 /etc/logrotate.d/myapp,内容如下:
/var/log/myapp/app.log {
size 50M
rotate 7
compress
delaycompress
missingok
notifempty
create 0644 appuser appgroup
copytruncate
}说明:
-
size 50M:单个日志文件最多 50MB,超限立刻轮转 -
rotate 7:最多保留 7 个归档(含压缩后文件),超出的最老文件自动删除 -
copytruncate:适用于无法重载日志的服务(如nohup启动的进程),先拷贝再清空原文件,不中断写入 -
create 0644 appuser appgroup:确保新日志权限和属主正确,避免应用因权限问题写失败
必须配合的关键细节
- 不要只设
size却忽略rotate:否则归档无限累积,总空间仍会失控 - 建议搭配
compress+delaycompress:刚轮转的日志不马上压缩,方便紧急排查;下次轮转时再压,兼顾效率与可用性 -
missingok和notifempty要加上:防止路径不存在或日志为空导致整个 logrotate 流程中断 - 若应用支持
postrotate,可加指令通知其重新打开日志文件(如kill -USR1 $(cat /var/run/nginx.pid)),但copytruncate已覆盖多数场景
验证是否生效
改完配置后别等 cron:
-
logrotate -d /etc/logrotate.d/myapp:模拟运行,检查路径、权限、size 是否达标 -
logrotate -f /etc/logrotate.d/myapp:强制执行一次,适合磁盘已满需立刻释放空间
执行后观察:原日志变为空或极小,同时出现带日期/序号的归档文件(如app.log-20260729或app.log.1),且ls -lh可确认单个活跃日志确实 ≤50M
不复杂但容易忽略:size 是治标关键,而 rotate + compress 才真正守住总空间底线。


















