核心是将自定义规则写入 /etc/logrotate.d/myapp(无扩展名、权限644),内容含日志路径、daily/rotate 7/compress等参数及postrotate脚本,再用logrotate -d调试、-f强制执行验证。

Linux 中编写自定义 logrotate 规则,核心是创建配置文件并确保它被 logrotate 主程序识别和执行。
明确配置文件存放位置
logrotate 默认读取 /etc/logrotate.conf,并自动包含 /etc/logrotate.d/ 目录下的所有文件(只要权限合理、无扩展名冲突)。推荐将自定义规则单独写在 /etc/logrotate.d/ 下,例如:/etc/logrotate.d/myapp
- 文件名不含空格或特殊符号(如 .conf),避免被忽略
- 权限建议设为
644(root 可读写,其他用户只读) - 不要修改
/etc/logrotate.conf主文件,便于系统升级时保持稳定
编写基础规则语法
一个典型规则包含日志路径、轮转参数和可选脚本块。示例:
/var/log/myapp/*.log {
daily
missingok
rotate 7
compress
delaycompress
create 0644 root root
sharedscripts
postrotate
systemctl reload myapp.service > /dev/null 2>&1 || true
endscript
}
-
daily:每天轮转(也可用weekly、monthly或size + 数值,如size 100M) -
missingok:日志文件不存在时不报错 -
rotate 7:保留最近 7 个归档(含当前正在写的) -
compress:启用 gzip 压缩旧日志;delaycompress表示本次轮转不压缩,下次再压,避免服务重载时访问被删的未压缩文件 -
create 0644 root root:轮转后新建日志文件,并设权限和属主 -
sharedscripts:整个匹配块只执行一次postrotate,而非每个文件都执行 -
postrotate/endscript:日志轮转完成后执行的操作,常用于通知服务重新打开日志文件
验证配置是否正确
写完配置后别急着等 cron 执行,先手动测试:
- 运行
logrotate -d /etc/logrotate.d/myapp:显示详细调试过程(不实际执行) - 加
-f强制执行:logrotate -f /etc/logrotate.d/myapp,观察是否生成新文件、压缩、调用 reload 等 - 检查
/var/log/myapp/目录下是否有xxx.log.1、xxx.log.1.gz等文件 - 确认服务仍在运行且新日志持续写入(说明
postrotate生效)
排查常见问题
规则不生效?几个高频原因:
- 日志路径写错或通配符没匹配到任何文件(
logrotate -d会告诉你“considering”哪些文件) - 配置文件权限不对(比如被设成 777 或 root:othergroup 且 othergroup 没读权限)
- 服务未按规范重打开日志:有些程序需
SIGHUP,有些需systemctl reload,有些甚至要kill -USR1,得查该服务文档 - cron 的 logrotate 任务被禁用或时间未到(
/etc/cron.daily/logrotate通常每天凌晨触发)











