Windows下Nginx日志按天切割必须用批处理脚本+任务计划实现:每日00:00:01执行rotate_logs.bat,重命名access.log和error.log为带当日日期的归档文件并存入cut_log目录,再执行nginx -s reopen通知Nginx重新打开日志,全程不中断服务且不影响PHP。

Windows 下 Nginx 1.30.5 搭配 PHP 8.1.30 时,日志分割不能依赖 logrotate(Linux 工具),必须通过批处理脚本 + Windows 任务计划实现。核心逻辑是:先重命名日志文件,再向 Nginx 主进程发送 reopen 信号,使其创建新日志并继续写入。整个过程不中断服务,PHP 后端也不受影响。
准备日志切割脚本(.bat)
在 Nginx 安装目录(如 D:\nginx-1.30.5)下新建文件夹 logs\cut_log,再在根目录创建 rotate_logs.bat,内容如下:
@echo off
setlocal enabledelayedexpansion
set "NGINX_DIR=D:\nginx-1.30.5"
set "LOGS_DIR=%NGINX_DIR%\logs"
set "CUT_DIR=%LOGS_DIR%\cut_log"
set "ACCESS_LOG=%LOGS_DIR%\access.log"
set "ERROR_LOG=%LOGS_DIR%\error.log"
for /f "tokens=1-4 delims=- " %%a in ('date /t') do (
set "YEAR=%%c"
set "MONTH=%%a"
set "DAY=%%b"
)
if "%MONTH:~0,1%"==" " set "MONTH=0%MONTH:~1,1%"
if "%DAY:~0,1%"==" " set "DAY=0%DAY:~1,1%"
set "TODAY=%YEAR%-%MONTH%-%DAY%"
if not exist "%CUT_DIR%" mkdir "%CUT_DIR%"
if exist "%ACCESS_LOG%" (
move "%ACCESS_LOG%" "%CUT_DIR%\access-%TODAY%.log" >nul
)
if exist "%ERROR_LOG%" (
move "%ERROR_LOG%" "%CUT_DIR%\error-%TODAY%.log" >nul
)
cd /d "%NGINX_DIR%"
nginx.exe -s reopen
endlocal
说明:
• 脚本自动提取系统日期并格式化为 YYYY-MM-DD;
• 使用 nginx -s reopen 替代 kill 命令,更安全、兼容性更好(Nginx Windows 版原生支持);
• 不依赖 PID 文件,避免路径或权限问题;
• PHP 进程不受影响,FastCGI 保持连接。
立即学习“PHP免费学习笔记(深入)”;
配置 Windows 任务计划(每日零点执行)
打开「任务计划程序」→「创建基本任务」:
• 名称填 Nginx Daily Log Rotate;
• 触发器设为「每天」,起始时间建议设为 00:00:01(避开整点可能的高并发);
• 操作选「启动程序」,程序/脚本填完整路径,例如:D:\nginx-1.30.5\rotate_logs.bat;
• 「起始于」填:D:\nginx-1.30.5\;
• 勾选「不管用户是否登录都要运行」和「不存储密码」(需以管理员权限运行)。
测试方法:右键任务 → 「运行」,检查 logs\cut_log\ 是否生成带日期的文件,且 access.log 是否已清空并可继续记录新请求。
增强实用性:自动压缩与清理旧日志
若需节省磁盘空间,可在脚本末尾追加压缩与清理逻辑(需系统已安装 7z.exe 或使用 PowerShell):
rem 压缩昨日日志(需提前下载 7-Zip 命令行版,并将 7z.exe 放入 PATH)
for /f "tokens=2 delims==" %%i in ('wmic os get localdatetime /value') do set dt=%%i
set "YESTERDAY=!dt:~0,4!!dt:~4,2!!dt:~6,2!"
set /a YESTERDAY-=1
rem 简化处理:仅压缩最近 7 天内的 .log 文件
forfiles /p "%CUT_DIR%" /s /d -7 /m *.log /c "cmd /c 7z a -tzip @path.zip @path && del @path"
rem 清理超过 30 天的 .zip 和 .log
forfiles /p "%CUT_DIR%" /s /d -30 /m *.zip /c "cmd /c del @path"
forfiles /p "%CUT_DIR%" /s /d -30 /m *.log /c "cmd /c del @path"
注意:
• forfiles 是 Windows 自带命令,无需额外安装;
• 若未部署 7-Zip,可改用 PowerShell 的 Compress-Archive(需 Windows 8+/PowerShell 5+);
• 所有操作均不影响 PHP-FPM 或 CGI 进程稳定性。
验证与排错要点
常见问题及应对方式:
• Nginx 报错“Access is denied”:任务计划中未勾选「使用最高权限运行」;
• 日志没被重命名,或仍往旧文件写:确认脚本中 nginx.exe -s reopen 执行成功(可加 echo %errorlevel% 调试);
• PHP 页面报 502 或超时:与日志切割无关,检查 php-cgi.exe 是否存活、fastcgi_pass 地址是否正确;
• access.log 为空但 error.log 正常:检查 Nginx 配置中 access_log 指令路径是否拼写错误,是否被 server 块中的 access_log off; 关闭。
不复杂但容易忽略:每次修改脚本后务必手动双击运行一次,确认无报错再交由任务计划托管。



















