linux中logrotate实现每周日志切割的关键是配置weekly触发条件并依赖系统每日cron自动判断,它通过/var/lib/logrotate/status记录上次轮转时间,每周首次满足7天间隔时(通常周一)执行轮转。

Linux 使用 logrotate 配置每周定期执行一次日志切割,关键在于设置 weekly 触发条件,并确保系统 cron 能按时调用 logrotate。它不是“手动设个时间点”,而是由系统默认的每日 cron 任务自动判断——只要配置了 weekly,logrotate 就会在每周第一次运行时(通常是周一)执行轮转。
下面分三步说清楚怎么配、怎么验证、怎么避免常见坑:
配置 weekly 日志轮转规则
在 /etc/logrotate.d/ 下为你的服务新建或编辑配置文件(比如 myapp),内容示例:
/var/log/myapp/*.log {
weekly
rotate 8
compress
delaycompress
missingok
notifempty
create 0644 myapp myapp
sharedscripts
postrotate
systemctl reload myapp 2>/dev/null || true
endscript
}
-
weekly:表示按周触发,logrotate 内部会记录上次轮转时间,只在距上次满 7 天后才真正执行 -
rotate 8:保留最近 8 周的日志(即.1到.8,或带日期后缀的归档) -
sharedscripts+postrotate:确保 reload 只执行一次,适合多个日志文件场景
⚠️ 注意:不要写
start 2026-07-27或类似时间偏移——logrotate 不支持自定义起始日,它依赖状态文件/var/lib/logrotate/status记录各日志的最后轮转时间,自动对齐自然周(默认周一为一周起点)。
确保系统 cron 正常运行 weekly 判断
logrotate 本身不“定时”,它靠 /etc/cron.daily/logrotate 每天运行一次。这个脚本会读取所有配置,并对满足 weekly 条件的日志执行轮转。
你可以检查 cron 是否启用:
systemctl list-timers | grep logrotate # 或查看 daily 任务是否存在 ls -l /etc/cron.daily/logrotate
只要该脚本存在且可执行,无需额外改动 cron —— 它天然支持 weekly 判断。
验证和调试 weekly 是否生效
直接模拟运行,看 logrotate 是否认为“该轮转了”:
sudo logrotate -d /etc/logrotate.d/myapp
输出中若出现类似:
rotating pattern: /var/log/myapp/*.log weekly, log start: 2026-7-27, last rotated: 2026-7-20 ... rotating log /var/log/myapp/access.log
说明它已识别到“距上次已过 7 天”,下次真实运行就会切割。
如需立即测试(跳过时间判断):
sudo logrotate -f /etc/logrotate.d/myapp
✅ 小技巧:首次部署后,可手动 touch 一个旧时间戳强制触发一次(仅调试用):
sudo touch -d "2026-07-20" /var/log/myapp/access.log
再跑-d就能看到 weekly 条件被满足。
不复杂但容易忽略细节。











