Logrotate支持“大小或时间任一满足即轮转”,需同时配置maxsize和daily等时间参数;实际触发依赖cron执行频率,调试可用logrotate -d验证判断逻辑。

Logrotate 本身不支持“时间与大小任一满足即触发轮转”的原生逻辑,maxsize 和 daily/weekly 等时间参数是“或”关系,但实际行为取决于是否启用 delaycompress 和 copytruncate,且需配合正确配置才能稳定实现双重触发目标。
理解 maxsize 与时间参数的真实协作机制
Logrotate 每次执行(通常由 cron 触发)时,会同时检查两个条件:
- 日志文件是否超过
maxsize(例如maxsize 100M) - 距离上次轮转是否已过指定时间周期(如
daily表示距上一次rotate操作满24小时)
只要其中任一条件为真,本次运行就会触发轮转。注意:这不是“实时监控”,而是“定时检查 + 满足即转”。因此,要实现“大小或时间任一达成即轮转”,只需在配置中同时写上 maxsize 和时间指令(如 daily)即可。
关键配置项与避坑要点
以下配置片段可实现“日志达100MB立即轮转,或即使不满也每天至少轮转一次”:
/var/log/myapp/*.log {
daily
maxsize 100M
rotate 7
compress
missingok
notifempty
create 644 root root
}
必须注意:
-
不要同时用
size和maxsize——size是旧版参数,已被弃用,仅用maxsize -
cron 执行频率决定响应延迟:若 logrotate 每天只运行一次(如默认的
/etc/cron.daily/logrotate),那即使日志瞬间涨到 200MB,也要等到下次 cron 触发才轮转。如需更及时响应,可将 logrotate 加入每小时甚至每10分钟 cron(需权衡系统负载) -
避免
copytruncate干扰 size 判断:如果应用不支持重打开日志文件,常加copytruncate。但它会在 copy 后清空原文件,导致 logrotate 下次检查时看到的是一个“新小文件”,可能跳过maxsize判断。建议优先让应用支持信号重载(如kill -USR1),再配postrotate通知
验证与调试方法
不依赖猜测,用命令直接测试逻辑是否生效:
- 手动模拟大日志:
dd if=/dev/zero of=/var/log/myapp/app.log bs=1M count=150 - 强制运行并看详细输出:
logrotate -d /etc/logrotate.d/myapp(-d 表示 debug,不真实轮转,只打印判断过程) - 观察输出中是否有类似
rotating log /var/log/myapp/app.log, log needs rotating及原因(log rotated due to maxsize或log rotated due to daily) - 确认生效后,用
logrotate -f /etc/logrotate.d/myapp强制执行一次
进阶:按小时粒度 + 大小双控(适合高流量服务)
若需更快响应(如“超50MB或每2小时轮转”),可自定义 cron 并改用 hourly(需确保 logrotate 脚本支持):
- 在配置中写
hourly和maxsize 50M - 把 logrotate 加入
/etc/cron.d/,例如每两小时跑一次:0 */2 * * * root /usr/sbin/logrotate /etc/logrotate.d/myapp - 注意:系统级
hourly需 logrotate ≥ 3.8.0,且/etc/logrotate.conf中未注释hourly定义











