logrotate 默认已安装且由 cron 每日触发,但常见问题在于配置未加载或规则不匹配;需验证命令存在、cron 脚本可执行、include 行未被注释、自定义配置放 /etc/logrotate.d/ 目录,并用 -d/-f 调试。

logrotate 默认已安装且 cron 每日自动触发,但多数问题出在配置未加载或规则不匹配——不是没轮转,是规则根本没生效。
确认 logrotate 是否真在运行
很多人改完配置却没效果,第一反应是“没生效”,其实常因 logrotate 根本没被调度。先验证基础状态:
- 运行
logrotate --version,确认命令存在;若报错,用sudo apt install logrotate(Debian/Ubuntu)或sudo yum install logrotate(RHEL/CentOS)补装 - 检查 cron 是否调用它:
ls -l /etc/cron.daily/logrotate,该脚本必须存在且可执行(权限至少为 755) - 查 systemd timer(较新系统):
systemctl list-timers | grep logrotate,无输出说明 daily 定时器被禁用或未启用 - 别只信
systemctl status logrotate——它不是 daemon,没有 service 单元,靠 cron 或 timer 驱动
/etc/logrotate.conf 的 include 行是否被注释
这是线上最常被忽略的致命点:子配置全失效,就因为这一行被手动注释了。
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
- 打开
/etc/logrotate.conf,找到include /etc/logrotate.d - 确保它**没被 # 注释**,且路径拼写完全一致(不能多空格、不能写成
include /etc/logrotate.d/带斜杠结尾) - 该行之后的所有配置(比如
rotate 4)是全局默认值,但只有 include 正常,你放在/etc/logrotate.d/myapp的规则才会被读到 - 改完保存,无需重启任何服务——logrotate 本身无进程,下次 cron 触发时自动加载新配置
为自定义日志写 /etc/logrotate.d/ 下的独立配置
不要直接改 /etc/logrotate.conf,新增服务一律走 /etc/logrotate.d/ 目录,否则卸载软件或系统升级时易冲突。
- 新建文件:
sudo nano /etc/logrotate.d/myapp - 内容示例(关键参数带说明):
/var/log/myapp/app.log { daily rotate 14 compress delaycompress missingok notifempty create 0640 myapp myapp copytruncate } -
daily和size +100M互斥,选一个;size +100M表示“超过 100MB 就切”,比size 100M(恰好等于才切)更可靠 -
copytruncate是给不支持 reopen 的程序(如多数 Java 进程)用的:先拷贝再清空原文件,避免中断写入;create只管新文件权限,不管旧文件 - 路径必须绝对、不能含 shell 变量(
$HOME、~全无效),通配符如/var/log/myapp/*.log可用,但只展开一次,不递归
调试和强制执行时的典型陷阱
测试阶段最容易因参数误用导致误删或静默失败。
- 语法检查用
sudo logrotate -d /etc/logrotate.d/myapp:-d 不改文件,只打印模拟过程;注意看输出里有没有error: stat of /var/log/myapp/app.log failed—— 路径不存在或权限不足会跳过整个块 - 强制执行用
sudo logrotate -f /etc/logrotate.d/myapp:-f 忽略时间判断,但不会覆盖正在写的文件(除非配了copytruncate) -
postrotate脚本里别用$1:如果用了sharedscripts(推荐用于 reload nginx),$1是空的;想操作具体文件?去掉sharedscripts,再用$1获取本次轮转的旧路径 - 轮转后检查
/var/lib/logrotate/status文件,里面记录每个日志上次轮转时间;手动 touch 这个文件或改 mtime 会干扰判断,别碰
真正难的不是写对一行 daily,而是理解 logrotate 没有“热加载”、不校验目标路径是否存在、也不保证原子性——它只是按规则做文件操作,所有依赖服务配合的地方(比如发信号 reload),都得你自己兜底。

















