Nginx日志轮转可靠性验证需分步手动执行:先用logrotate -d确认路径匹配、日期命名(如access.log-2026-10-09)及postrotate识别;再用logrotate -vf强制轮转,检查归档文件生成、worker进程fd指向access.log、error.log无reopen报错;最后验证轮转前后access.log时间戳连续无丢失,并确认配置位于/etc/logrotate.d/nginx且权限为644。

测试和验证 Nginx 日志轮转脚本是否可靠,关键不是“跑起来就行”,而是确认它在真实 cron 环境下能准确切割、归档、通知 Nginx 并不丢日志。必须分步手动验证,跳过这步等于埋雷。
用 logrotate -d 模拟执行流程
先看 logrotate 会做什么,不改任何文件:
- 运行 sudo logrotate -d /etc/logrotate.d/nginx
- 检查输出中是否匹配到你的日志路径(如
/var/log/nginx/*.log) - 确认它识别出
daily+dateyesterday,并计划生成类似access.log-2026-10-09的文件名(注意:今天是 10 月 10 日,应显示昨天日期) - 留意是否提示
sharedscripts生效、postrotate块被识别,以及 PID 文件路径是否可读
用 logrotate -vf 强制执行一次轮转
模拟 cron 实际行为,触发真实切割与重载:
- 运行 sudo logrotate -vf /etc/logrotate.d/nginx
- 立即检查
/var/log/nginx/目录:应出现带日期后缀的归档文件(如access.log-2026-10-09),原access.log变为空或仅含轮转后新写入的日志 - 用 ls -l /proc/$(cat /var/run/nginx.pid)/fd/ | grep log 查看 worker 进程打开的日志文件路径——它必须指向
access.log(未加后缀),说明 USR1 已生效 - 观察 Nginx 错误日志(
/var/log/nginx/error.log)末尾是否有 reopen 相关报错
验证日志写入连续性
确保轮转过程中无日志丢失:
- 轮转前:执行 curl -sI http://localhost > /dev/null 几次,再查
tail -n 3 /var/log/nginx/access.log记下最后时间戳 - 轮转后:立刻再发几次请求,查新
access.log开头几行,确认时间戳是轮转后的新时间(非中断或回退) - 同时检查刚生成的
access.log-2026-10-09是否包含轮转前的请求,且末尾时间接近 23:59:59(若 daily 触发在午夜)
检查 cron 是否真正加载该配置
logrotate 配置放错位置就完全无效:
- 确认文件路径是 /etc/logrotate.d/nginx(不能是
.conf后缀,也不能在/root/或其他目录) - 运行 ls -l /etc/logrotate.d/nginx:权限应为
-rw-r--r--(644),属主属组为root:root - 手动触发系统级轮转:sudo /etc/cron.daily/logrotate,观察输出是否包含 nginx 配置的处理记录


















