logrotate不随系统启动自动加载,主因是cron服务未启用或未运行;需检查systemctl is-active/enabled crond,确保其active且enabled,并验证/etc/logrotate.d/配置文件存在、权限正确、末尾有换行符,同时确认postrotate中命令使用绝对路径及nginx.pid路径匹配。

logrotate 配置没随系统启动自动加载
logrotate 本身不常驻内存,它靠 cron 定时触发。重启后如果 cron 服务没起来,或没被启用,规则就永远不会执行。常见于最小化安装的 CentOS/RHEL 系统,默认可能没装 vixie-cron,或者 systemd 里 crond.service 处于 disabled 状态。
检查方式:systemctl is-active crond 应返回 active;systemctl is-enabled crond 应返回 enabled。若不是,运行:systemctl enable --now crond
logrotate 脚本权限或路径被重置
你手动放在 /etc/logrotate.d/ 下的配置文件,如果服务器是通过镜像克隆、模板部署或某些自动化工具重装过系统,该目录内容可能被覆盖或清空。尤其宝塔面板用户容易遇到:它会定期校验并重写自己的日志配置,把你加的全局规则删掉。
验证方法:ls -l /etc/logrotate.d/ | grep -E "(nginx|dify|your-custom-name)";若缺失,需重新放入并确认权限为 644,属主为 root:root
常见疏漏点:
- 文件末尾漏了换行符,导致
logrotate解析失败(静默跳过) - 配置中用了相对路径或变量(如
$HOME),而logrotate运行时没有 shell 环境,会直接报错退出 -
postrotate段里调用的nginx -s reopen或kill -USR1命令路径没写绝对路径(如用/usr/sbin/nginx而非nginx)
nginx.pid 文件路径与配置不匹配
logrotate 的 postrotate 脚本里通常要读取 nginx.pid 来发信号。但 nginx 编译安装、包管理安装、宝塔安装的 pid 路径各不相同:/var/run/nginx.pid、/usr/local/nginx/logs/nginx.pid、/www/server/nginx/logs/nginx.pid。重启后若 nginx 本身没自启,或 pid 路径在配置里写错了,kill -USR1 就会失败,旧日志继续写入,新日志文件为空。
确认当前真实路径:ps aux | grep nginx | grep master | awk '{print $NF}' —— 看启动命令里带的 -p 参数;或查 nginx 配置:grep pid /www/server/nginx/conf/nginx.conf(宝塔)或 grep pid /usr/local/nginx/conf/nginx.conf(源码编译)
容器环境里 logrotate 根本没运行
如果你的日志切割是在容器内做的(比如直接在 Docker 容器里跑 logrotate),那重启宿主机后,容器默认不会自动重启,或者即使设了 restart: always,crond 在容器里也大概率没开——绝大多数基础镜像不预装 cron,更不会启用它。
此时真正起作用的应是宿主机上的 logrotate,且日志路径必须挂载到宿主机可访问位置(如 -v /host/logs:/app/logs),再由宿主机的 /etc/logrotate.d/xxx 针对 /host/logs/*.log 配置。否则容器一重启,所有定时逻辑全失效。
最常被忽略的一点:logrotate 不报错也不提示失败,它只是默默跳过有问题的配置。所以别只看日志文件有没有被切,一定要查 /var/lib/logrotate/status 里最后执行时间,再配合 logrotate -d /etc/logrotate.conf(调试模式)看是否真被加载和执行了。











