logrotate 可通过 size 参数按文件大小触发日志切割,推荐在 /etc/logrotate.d/ 下为各应用单独配置,需确保主配置中 include /etc/logrotate.d 未被注释;关键参数包括 size 100M、copytruncate、create 和 rotate 7;可用 -d 和 -f 手动验证。

直接用 size 参数就能让 logrotate 按文件大小触发日志切割,不依赖 daily、weekly 等时间周期。
配置位置要对
别改 /etc/logrotate.conf 主配置文件,除非你想统一影响所有服务。
推荐做法是在 /etc/logrotate.d/ 下为每个应用单独建配置文件,比如:
-
/etc/logrotate.d/nginx管 Nginx 日志 -
/etc/logrotate.d/myapp管自研程序日志
确保主配置里这行没被注释:include /etc/logrotate.d
否则你新建的配置根本不会生效。
核心参数写法
在配置文件中指定日志路径后,用 size 加单位(M 或 K)触发轮转。例如:
/var/log/myapp/app.log {
size 100M
rotate 7
compress
missingok
notifempty
create 0640 myapp myapp
copytruncate
}
-
size 100M:文件一达到 100MB 就立即轮转(注意不是“超过”才触发,是“达到即触发”) -
copytruncate:关键参数,避免应用因文件被重命名而写入失败;它先拷贝再清空原文件,让进程继续往原路径写 -
create 0640 myapp myapp:轮转后自动创建新日志文件,并设好权限和属主属组 -
rotate 7:最多保留 7 个归档(含压缩后的),超出的自动删除
验证是否生效
不用等 cron 自动跑,立刻手动测试:
- 查看解析逻辑(不执行,只检查语法和判断):
sudo logrotate -d /etc/logrotate.d/myapp - 强制执行一次轮转:
sudo logrotate -f /etc/logrotate.d/myapp - 执行后观察
/var/log/myapp/下是否生成app.log.1,原app.log是否变小或清空
注意几个易错点
-
size和时间周期(如daily)互斥,同时写会以「先满足条件者为准」,但建议只留size,避免逻辑混乱 - 如果应用自己管理日志(比如 Java 用 logback),确认它没开启内部滚动,否则可能和 logrotate 冲突
-
copytruncate虽方便,但拷贝和清空之间有微小时间差,高并发场景下可能丢几行日志;要求零丢失时,应配合postrotate发送信号让应用重新打开日志文件
不复杂但容易忽略











