logrotate -f 必须指定正确路径才生效:直接轮转某服务用 /etc/logrotate.d/服务名,全局轮转需确保 /etc/logrotate.conf 中 include /etc/logrotate.d 未被注释;-d 调试可预览执行计划,避免静默失败。

能,但必须用 -f 参数强制触发,且配置文件路径要写对——否则什么都不会发生,也不会报错。
logrotate -f 后跟什么路径才有效
很多人执行 logrotate -f /etc/logrotate.conf 没反应,其实是误以为主配置文件能“自动加载所有子配置”。它确实会读取 include /etc/logrotate.d,但前提是该行未被注释,且子配置语法无硬错误。
更稳妥的做法是直接指定目标配置文件:
- 只轮转 Nginx 日志:
sudo logrotate -f /etc/logrotate.d/nginx - 只轮转自定义应用日志:
sudo logrotate -f /etc/logrotate.d/myapp - 想覆盖全局 + 所有子配置(不推荐):
sudo logrotate -f /etc/logrotate.conf,但需确认include /etc/logrotate.d行存在且未注释
为什么加了 -f 却没看到新日志文件
常见原因不是命令失效,而是配置本身没生效条件或权限卡住:
在无 root/sudo 权限的环境(云容器、VPS、隔离主机)中安装并配置 OpenClaw 浏览器工具的 headless Chrome。适用场景:...
-
notifempty开启时,若当前日志为空,logrotate会跳过轮转 —— 先echo "test" >> /var/log/myapp/app.log写点内容再试 -
create指令要求 logrotate 有权限在日志目录下创建文件;如果目录属主是myapp,但运行logrotate的是root,通常没问题;但如果用了su myapp myapp,而myapp用户无权写入该目录,就会失败 - 日志文件被进程独占打开(如 tail -f 正在读、或应用未释放 fd),
copytruncate可绕过重命名失败,但没加这行就可能静默跳过
调试时别只信 -f,先用 -d 看它到底打算做什么
logrotate -d 不改任何文件,只打印完整执行计划,是最可靠的预检手段:
-
sudo logrotate -d /etc/logrotate.d/myapp会列出:是否满足轮转条件、将重命名哪些文件、是否调用postrotate、压缩是否启用等 - 如果输出里出现
log does not need rotating,说明当前不满足触发条件(比如配置了daily但今天已轮过,或size +10M但文件才 2MB) - 若报
error: skipping "/var/log/myapp/app.log" because parent directory has insecure permissions,说明上层目录权限太宽松(如 777),logrotate 会拒绝操作以保安全
轮转后应用还在往旧文件写?检查 copytruncate 和 postrotate
很多服务(如 Nginx、自研 daemon)不会自动感知日志文件被重命名,导致新日志继续写进 app.log.1 而非 app.log:
- 加
copytruncate是最轻量的解法:先复制内容再清空原文件,应用无需重启或 reload,但有极小概率丢最后一段写入 - 更可靠的是用
postrotate通知服务 reopen 日志,例如:postrotate systemctl kill --signal=SIGUSR1 myapp.service >/dev/null 2>&1 || true endscript
(具体信号查对应服务文档,Nginx 是SIGUSR1,rsyslog 是SIGHUP) - 注意
sharedscripts:多个日志路径共用一套postrotate,避免重复执行
真正容易被忽略的是:logrotate 默认不验证目标日志文件是否存在,也不校验 create 指令里的用户/组是否真实存在。一旦配置里写了不存在的组名,轮转会静默失败——建议每次新增配置后都跑一遍 -d 看输出末尾有没有 warning。










