簡體   English   中英

nginx 在 windows 上的日志輪換

[英]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上檢查)。 盡管此實用程序具有內置的旋轉功能,但它可能無法正常工作。 該文檔警告在線輪換的風險。

應該配置兩個服務條目:

  1. Nginx,和

  2. 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM