Windows下Nginx日志按天切割需借助批处理脚本与任务计划器实现:每日00:00执行rotate_logs.bat,重命名access.log和error.log为带昨日日期的归档文件,并通过nginx -s reopen通知Nginx重新打开日志。

Windows 下 Nginx 日志按天切割,靠 Nginx 自身不支持,需借助批处理脚本 + Windows 任务计划器实现。核心思路是:每天零点把 access.log 和 error.log 重命名存档(如加日期后缀),再通知 Nginx 重新打开日志文件(即 reload)。
一、准备日志切割脚本(.bat)
在 Nginx 安装目录下(例如 C:\nginx)新建一个文本文件,命名为 rotate_logs.bat,内容如下:
@echo off
setlocal enabledelayedexpansion
:: 设置 Nginx 路径(根据实际修改)
set "NGINX_DIR=C:\nginx"
set "LOG_DIR=%NGINX_DIR%\logs"
:: 获取昨日日期(格式:20240815)
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%"
:: 移动 access.log 和 error.log(加昨日日期)
if exist "%LOG_DIR%\access.log" (
move "%LOG_DIR%\access.log" "%LOG_DIR%\access_%YESTERDAY%.log"
)
if exist "%LOG_DIR%\error.log" (
move "%LOG_DIR%\error.log" "%LOG_DIR%\error_%YESTERDAY%.log"
)
:: 通知 Nginx 重新打开日志(等价于 reload)
"%NGINX_DIR%\nginx.exe" -s reopen
endlocal
⚠️ 注意:
- 脚本中 YESTERDAY 使用的是「当前系统时间的日期」,不是严格“昨天”。若在凌晨 00:01 执行,会用当天日期归档——所以务必把计划任务设为每天 00:00 触发;
- -s reopen 是关键,它让 Nginx 关闭旧句柄、打开新日志文件(无需重启服务,不中断请求);
- 确保该脚本以管理员权限运行(否则可能因权限不足无法向 logs 目录写入或调用 nginx -s)。
二、创建 Windows 任务计划
打开「任务计划程序」→「创建基本任务」:
-
名称:例如
Nginx Log Rotate Daily -
触发器:选择「每天」,起始时间设为
00:00:00,勾选「启用」 -
操作:「启动程序」→ 程序/脚本填完整路径,如
C:\nginx\rotate_logs.bat;起始于填C:\nginx\(确保工作目录正确) -
安全选项:勾选「不管用户是否登录都要运行」+「使用最高权限运行」;用户账户建议选
SYSTEM或具有本地管理员权限的账户
三、验证与补充说明
执行一次脚本后,检查:
- logs\ 目录下是否生成了类似 access_20240815.log 的文件;
- 原 access.log 是否变为空文件(说明 reopen 成功);
- Nginx 是否仍在正常提供服务(可 curl 或刷新网页确认)。
? 小建议:
- 如需保留多日日志,可在脚本末尾加一句删除 30 天前的日志(用 forfiles);
- 若 Nginx 是以 Windows 服务方式运行(如用 nginx -s install),仍可用 -s reopen,无需改用 service 控制;
- 避免直接用 nginx -s reload 替代 reopen,reload 会校验配置,失败会导致服务中断。
四、替代方案(轻量进阶)
如果希望更灵活(如按小时切、压缩归档),可改用 PowerShell 脚本:
- 利用 Get-Date -Format "yyyyMMdd" 获取日期;
- 用 Compress-Archive 自动压缩旧日志;
- 配合 ScheduledTasks 模块管理计划任务(适合批量部署)。
但对大多数场景,上面的 .bat + 计划任务已足够稳定简洁。

















