今天在检查一台 Windows 服务器的时候,发现了很早写的一个 nginx 日志切割脚本。个人觉得,经过时间沉淀下来的都是好东西,所以,决定分享出来。
使用时,先在 nginx 的日志目录下创建一个 history 目录,用来存放历史日志文件。当然,要放在其它地方也是可以的。请自行设定好 appDir、logDir、oldLogDir 这几个参数。
一般情况下,我都会配成系统服务,所以,我的脚本是调用系统服务来启动和停止 nginx 的。如果没有配成系统服务的话,请把脚本中的 net stop Nginx/net start Nginx 换成相应的命令,比如:nginx -s reload。
整个脚本代码如下:
rem 作者:靑龍一笑(C.S.Ricen)
rem 功能:nginx 日志切割脚本
set Y=%date:~0,4%
set M=%date:~5,2%
set D=%date:~8,2%
set DG=1
set/a vY1=%Y% %% 400
set/a vY2=%Y% %% 4
set/a vY3=%Y% %% 100
if %vY1%==0 (
set var=true
) else (
if %vY2%==0 (
if %vY3%==0 (
set var=false
) else (
set var=true
)
) else (
set var=false
)
)
set LY=%Y%
set LM=%M%
if %M:~0,1%==0 (
set M=%M:~1,1%
)
if %D:~0,1%==0 (
set D=%D:~1,1%
)
if %D% GTR %DG% (
set/a LD=%D%-%DG%
) else (
if %M%==1 (
set/a LY=%Y%-1
) & (
set/a LM=12+%M%-1
) & (
set/a LD=31+%D%-%DG%
) else (
set/a LM=%M%-1
if %M%==3 (
if %var%==false (
set/a LD=28+%D%-%DG%
) else (
set/a LD=29+%D%-%DG%
)
)
for %%a in (2 4 6 8 9 11) do (
if "%M%"=="%%a" (
set/a LD=31+%D%-%DG%
)
)
for %%b in (5 7 8 10 12) do (
if "%M%"=="%%b" (
set/a LD=30+%D%-%DG%
)
)
)
)
if %LM% LSS 10 set LM=0%LM:~-1%
if %LD% LSS 10 set LD=0%LD:~-1%
set lDate=%LY%%LM%%LD%
set appDir=D:\Nginx
set logDir=D:\Nginx\logs
set oldLogDir=D:\Nginx\logs\history
echo "开始执行日志切割 ……"
for %%i in (%logDir%\*.log) do (
for /f %%j in ('dir /B %%i') do (
move %logDir%\%%j %oldLogDir%\%%j_%lDate%
)
)
echo "重新打开日志文件 ……"
net stop Nginx
tasklist -v | findstr "nginx.exe" > NUL
if ErrorLevel 1 (
echo Nginx 已停止。
) else (
taskkill /f /im nginx.exe > nul
)
if exist %logDir%\nginx.pid (
del %logDir%\nginx.pid
)
net start Nginx
echo "删除 180 天前的日志文件 ……"
forfiles /p "%oldLogDir%" /d -180 /c "cmd /c del /f @path"
exit
Copyright © 2005-2023 by www.ricensoftwares.com.cn All Rights Reserved.