天天看點

Linux日常小技巧nginx日志分割

作者:風趣運維工程獅

nginx日志分割防止日志過大而影響我們對日志的檢視,今天給大家分享一個我在工作中作的一個windows的nginx日志分割具體步驟如下:

使用winsw來将nginx安裝為服務()下載下傳位址,

1. 從官網下載下傳WinSW.NET2.exe檔案,并重命名為nginx-service.exe;

2. 建立nginx-service.xml檔案,并根據配置檔案說明來編寫配置參數。

Linux日常小技巧nginx日志分割
Linux日常小技巧nginx日志分割

配置檔案說明

<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服務的對應關系如下:

Linux日常小技巧nginx日志分割
Linux日常小技巧nginx日志分割

其中%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可以使用的各種指令

Linux日常小技巧nginx日志分割

運作指令:nginx-service.exe install

可以将目前目錄下的nginx安裝為服務

Linux日常小技巧nginx日志分割

運作指令:nginx-service.exe uninstall

可以解除安裝已安裝的服務

Linux日常小技巧nginx日志分割

但是nginx以服務運作後會出現一個問題,當執行nginx -s reload重新加載指令,或nginx -s stop停止指令時,會出現以下錯誤:

Linux日常小技巧nginx日志分割

這是因為nginx服務是以“本地系統”的登入方式運作的,目前使用者沒有權限對它的服務程序進行操作,

Linux日常小技巧nginx日志分割

為了解決這個問題,需要打開如下所示的服務“屬性”彈窗,選擇“登入”頁籤選擇登入身份為“此賬戶”并選擇目前登入系統的使用者,輸入相應的密碼。

Linux日常小技巧nginx日志分割

配置完成後,可以看到Nginx對應的服務已經“登入為”設定的使用者了

Linux日常小技巧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
                )
            )
        )
    )
)           

整理不易,歡迎點贊,收藏,轉發,關注我每天分享一下運維小知識。

繼續閱讀