[英]log rotation for nginx on windows
我在 web 上找到了很多關於在 linux 下旋轉 nginx 日志的參考資料。只需將 USR1 信號發送到進程。 但是... unix 類似的信號在 windows 上不存在,我無法找到這方面的任何信息。 我怎樣才能在 windows 上用 nginx 完成同樣的事情?
要在 Windows 中輪換 nginx 日志,請創建一個這樣的批處理文件:
For /f "tokens=2-4 delims=/ " %%a in ('date /t') do (set YMD=%%c-%%a-%%b)
move C:\path\to\nginx\logs\Access.log C:\path\to\nginx\logs\Access_%YMD%.log
move C:\path\to\nginx\logs\Error.log C:\path\to\nginx\logs\Error_%YMD%.log
call C:\path\to\nginx\nginx -p C:\path\to\nginx -s reopen
第一行只是創建一個時間戳(歸功於Jay )
然后在 Windows 中創建一個計划任務來運行該批處理文件,您希望以何種頻率輪換日志。
如果 nginx 作為服務運行(例如通過此處描述的 Windows 服務包裝器),您不能簡單地調用 nginx 命令,例如nginx -s reopen
直接nginx -s reopen
。 相反,您必須以運行服務的用戶身份運行命令。
為此,請創建一個名為nginx
的新用戶(例如),並將服務和計划任務配置為以該用戶身份運行。 您還必須確保您的用戶具有“作為批處理作業登錄”的權限。
如果您想在命令行上測試您的輪換腳本而不必使用計划任務,您可以使用
runas /user:nginx "C:\path\to\rotateLogs.bat"
實際上,(盡管進行了大量的谷歌搜索),答案可以直接在文檔頁面中找到。
命令是:
nginx -s reopen
但這似乎只有在從命令行運行 nginx 時才有效——目前這是目前在 Windows 上運行 nginx 的唯一官方方法。
我的下一個挑戰是弄清楚如何在將 nginx 作為 Windows 服務運行時如何使其工作,如下所述: Nginx Windows Service 。
使用 Windows Server 2008 R2,我創建了這個批處理文件,並每天在午夜安排一次:
@echo off
SET DATE=%date%
SET DAY=%DATE:~0,2%
SET MONTH=%DATE:~3,2%
SET YEAR=%DATE:~6,4%
SET DATE_FRM=%YEAR%-%MONTH%-%DAY%
ECHO %DATE_FRM%
REM ECHO %YEAR%
REM ECHO %MONTH%
REM ECHO %DAY%
move D:\nginx-1.11.1\logs\access.log D:\nginx-1.11.1\logs\access_%DATE_FRM%.log
move D:\nginx-1.11.1\logs\error.log D:\nginx-1.11.1\logs\error_%DATE_FRM%.log
call D:\nginx-1.11.1\nginx -p D:\nginx-1.11.1 -s reopen
1.首先創建一個文件來存儲您的日志文件列表,例如“nginx_log.lst”,內容如下:
D:\\projects\\example.com\\data\\log\\access.log D:\\projects\\example.com\\data\\log\\error.log
2.將以下內容保存到“nginx_log_rotate.bat”等bat文件中:
@echo off
set YMD=%date:~0,4%%date:~5,2%%date:~8,2%
set LOG_FILE=
FOR /F "eol=; delims=, " %%i in (nginx_log.lst) do (
echo "%%i"
move "%%i" "%%i.%YMD%"
)
pushd C:\tools\nginx
nginx -s reopen
popd
pause
@echo on
3.創建一個調度任務,隨心所欲地運行bat
由於某些原因,下面的批處理文件對我有用。
For /f "tokens=1-4 delims=/ " %%a in ('date /t') do (set YMD=%%c-%%a-%%b)
move .\logs\access.log .\logs\access.%YMD%.log
move .\logs\error.log .\logs\error.%YMD%.log
nginx.exe -s reload
它或多或少與上面湯姆的回答相同。
我編寫了一個小實用程序,它在 stoppig nginx(作為 Windows 服務運行)幾秒鍾后輪換日志文件。
它有特定的要求停止,然后復制日志文件,然后每晚重新啟動服務。 您可以下載代碼並隨心所欲地更改它。
代碼在這里: http : //mandar.tumblr.com/post/5419161330/nginx-logrotate-windows
謝謝
@echo off
SET DATE_FRM=%date%
REM set path of Nginx root folder.
SET NGINX_PATH="E:\nginx-1.14.2"
REM create old_logs folder if not exists , we will move old logs in this folder.
if not exist "%NGINX_PATH%\old_logs\NUL" mkdir "%NGINX_PATH%\old_logs"
REM move error.log in old_logs from logs folder and rename it
move %NGINX_PATH%\logs\access.log %NGINX_PATH%\old_logs\access_%DATE_FRM%.log
move %NGINX_PATH%\logs\error.log %NGINX_PATH%\old_logs\error_%DATE_FRM%.log
REM reopn nginx logs, this will create new error.log for nginx.
call %NGINX_PATH%\nginx -p %NGINX_PATH% -s reopen
REM compress error%DATE_FRM%.log, this will create error_%DATE_FRM%.log.zip file.
powershell Compress-Archive -Path %NGINX_PATH%\old_logs\access_%DATE_FRM%.log -DestinationPath %NGINX_PATH%\old_logs\access_%DATE_FRM%.log.zip -force
powershell Compress-Archive -Path %NGINX_PATH%\old_logs\error_%DATE_FRM%.log -DestinationPath %NGINX_PATH%\old_logs\error_%DATE_FRM%.log.zip -force
REM delete error%DATE_FRM%.log from old_logs.
del %NGINX_PATH%\old_logs\access_%DATE_FRM%.log
del %NGINX_PATH%\old_logs\error_%DATE_FRM%.log
我使用NSSM管理 Windows 上的 Nginx (在WhiteHorse上檢查)。 盡管此實用程序具有內置的旋轉功能,但它可能無法正常工作。 該文檔警告在線輪換的風險。
應該配置兩個服務條目:
Nginx,和
Nginx 輪換日志。
該解決方案不支持基於文件大小或文件年齡的輪換。 可以使用nginx -s reopen
設置輪換日志的計划。
首先,
使用 NSSM 創建 Nginx Rotate Logs 服務(注意:您可以使用相同的命令創建主 Nginx 服務)。
下面的命令將創建服務條目:
nssm install "Nginx Rotate" C:\tools\nginx-1.21.6\nginx.exe
下一行將逐步配置服務,此處沒有oneliner。
nssm set "Nginx Rotate" AppParameters "-s reopen"
nssm set "Nginx Rotate" AppExit Default Exit
nssm set "Nginx Rotate" AppStdout C:\tools\nginx-1.21.6\logs\access.log
nssm set "Nginx Rotate" AppStderr C:\tools\nginx-1.21.6\logs\error.log
nssm set "Nginx Rotate" AppRedirectHook 1
nssm set "Nginx Rotate" AppRotateFiles 1
nssm set "Nginx Rotate" AppRotateOnline 1
nssm set "Nginx Rotate" AppTimestampLog 1
nssm set "Nginx Rotate" Description "Some description"
nssm set "Nginx Rotate" DisplayName "Nginx Rotate Logs"
nssm set "Nginx Rotate" ObjectName DOMAIN\user "password"
nssm set "Nginx Rotate" Start SERVICE_DEMAND_START
nssm set "Nginx Rotate" Type SERVICE_WIN32_OWN_PROCESS
然后編輯服務:
nssm edit "Nginx Rotate"
在您需要設置的最后一個選項卡上:
Event = Log rotation + Before online log rotation
如下圖所示。
因此,此服務將處於手動模式。 啟動后,它會旋轉日志並停止。
二、
創建計划任務。
schtasks /create /sc daily /st 03:30 /tn "Nginx Rotate Logs" /tr "C:\Program Files\PowerShell\7\pwsh.exe -command start-service 'Nginx Rotate Logs'"
重要,
對 Nginx、Nginx 輪換日志和計划任務使用相同的用戶。
用法:
當主 Nginx 運行時,計划任務每天運行一次,輪換文件。
輔助:
您可以添加每日任務(或添加到掛鈎選項卡)來壓縮和清除舊日志,例如:
# install PSCX module
Install-Module -Name Pscx -AllowPrerelease -AllowClobber
# compress
Get-ChildItem 'C:\tools\nginx-1.21.6\logs\*.log' | Where {$_.lastwritetime -lt (Get-Date).AddDays(-1)} | write-zip
# purge yesterday zip
Get-ChildItem 'C:\tools\nginx-1.21.6\logs\*.zip' | Where {$_.lastwritetime -lt (Get-Date).AddDays(-2)} | Remove-Item -Force
@echo off
net stop nginx
for /f "tokens=2 delims==" %%a in ('wmic OS Get localdatetime /value') do set "dt=%%a"
set "YY=%dt:~2,2%" & set "YYYY=%dt:~0,4%" & set "MM=%dt:~4,2%" & set "DD=%dt:~6,2%"
set "HH=%dt:~8,2%" & set "Min=%dt:~10,2%" & set "Sec=%dt:~12,2%"
set "datestamp=%YYYY%%MM%%DD%" & set "timestamp=%HH%%Min%%Sec%"
set "fullstamp=%YYYY%-%MM%-%DD%_%HH%-%Min%-%Sec%"
echo move %~dp0\Access.log %~dp0\Old\Access_%fullstamp%.log
move %~dp0\Access.log %~dp0\Old\Access_%fullstamp%.log
echo move %~dp0\Error.log %~dp0\Old\Error_%fullstamp%.log
move %~dp0\Error.log %~dp0\Old\Error_%fullstamp%.log
net start nginx
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.