nginx日志分割防止日志過大而影響我們對日志的檢視,今天給大家分享一個我在工作中作的一個windows的nginx日志分割具體步驟如下:
使用winsw來将nginx安裝為服務()下載下傳位址,
1. 從官網下載下傳WinSW.NET2.exe檔案,并重命名為nginx-service.exe;
2. 建立nginx-service.xml檔案,并根據配置檔案說明來編寫配置參數。
配置檔案說明
<service>
<id>nginx-1.18.0</id>
<name>Nginx Service</name>
<description>Nginx Service</description>
<executable>%BASE%\nginx.exe</executable>
<stoparguments>-s stop</stoparguments>
<logpath>%BASE%\logs\nginx-service</logpath>
<log mode="roll-by-size">
<sizeThreshold>10240</sizeThreshold>
<keepFiles>8</keepFiles>
</log>
</service>
與windows服務的對應關系如下:
其中%BASE%表示的是exe檔案所在的目錄,是以為了以上配置能正常生效,需要将exe檔案、xml配置檔案都放在nginx的根目錄中
stoparguments表示停止windows服務時執行指令的參數,與executable結合起來就是:nginx.exe -s stop
log參數配置的是winsw的運作日志,一般包括安裝、解除安裝服務、服務運作等資訊,其中sizeThreshold表示日志檔案的最大存儲值,keepFiles表示最多保留多少個日志檔案。
1. 安裝服務
将nginx-service.exe以及配置好的nginx-service.xml檔案拷貝到nginx根目錄後,打開指令行視窗,切換到目前目錄
如下,輸入nginx-service.exe -h,可以看到winsw可以使用的各種指令
運作指令:nginx-service.exe install
可以将目前目錄下的nginx安裝為服務
運作指令:nginx-service.exe uninstall
可以解除安裝已安裝的服務
但是nginx以服務運作後會出現一個問題,當執行nginx -s reload重新加載指令,或nginx -s stop停止指令時,會出現以下錯誤:
這是因為nginx服務是以“本地系統”的登入方式運作的,目前使用者沒有權限對它的服務程序進行操作,
為了解決這個問題,需要打開如下所示的服務“屬性”彈窗,選擇“登入”頁籤選擇登入身份為“此賬戶”并選擇目前登入系統的使用者,輸入相應的密碼。
配置完成後,可以看到Nginx對應的服務已經“登入為”設定的使用者了
然後重新開機Nginx服務,nginx的指令也可以順利執行了
這裡費勁解決這個問題,主要是因為nginx服務的重新開機是:停止+啟動的過程,并不會像nginx -s reload一樣在啟動之前檢查配置檔案是否正确。
2. nginx日志分割
使用該腳本前,需要先修改腳本中NGINX_HOME對應的路徑:
Windows 系統下使用 cmd 編寫的 nginx 日志分割腳本:
cmd複制代碼@echo off
set logPath=D:\nginx1.18\logs
set date=%date:~0,4%-%date:~5,2%-%date:~8,2%
set backupFolder=D:\nginx1.18\logs\backup
:: 如果備份目錄不存在,則建立該目錄
if not exist %backupFolder% mkdir %backupFolder%
:: 找到所有日志檔案并複制到備份目錄
for %%i in (%logPath%\*.log) do (
for /f "tokens=1-3 delims=." %%a in ("%%~ni") do (
if not "%%c"=="" (
if %%b==%date% (
copy "%%~fi" "%backupFolder%\%%a_%%b.%%c"
)
) else (
if %%a==access (
if %%b==%date% (
copy "%%~fi" "%backupFolder%\access_%%b.log"
)
)
)
)
)
:: 清空日志檔案
for %%i in (%logPath%\*.log) do (
for /f "tokens=1-3 delims=." %%a in ("%%~ni") do (
if not "%%c"=="" (
if %%b==%date% (
>"%%~fi" type nul
)
) else (
if %%a==access (
if %%b==%date% (
>"%%~fi" type nul
)
)
)
)
)
整理不易,歡迎點贊,收藏,轉發,關注我每天分享一下運維小知識。