読者です 読者をやめる 読者になる 読者になる

Windows bat: ログファイルをローテートする

bat Windows

Windowsのbatプログラムでログのローテートをする方法です。サンプルとしてファイルサイズによるログローテートを記載しています。

  • 最大バイト数を超えた場合、世代番号でローテートする。ローテートは1から最大の世代数で範囲で実行し、途中で抜けがあっても範囲内のファイルは全てローテートする。
  • 最大の世代数を超えた場合、そのファイルは削除する。

週単位や月単位でローテートする場合は、ジョブの実行タイミングを調整し、「FileRotate.bat」を週1や月1で実行すればよいと思います。

FileRotate.bat

@setlocal enabledelayedexpansion
@echo off

rem ******************************************************************
rem * FileRotate.bat: ローテート処理 
rem * %1: ファイルのフォルダ C:\work\log
rem * %2: ファイル名 Error.log
rem * %3: 最大の世代数
rem ******************************************************************
rem echo FileRotate.bat %1 %2 %3

rem ファイル名と世代番号の区切り文字
set DOT=.

for /l %%i in (%3,-1,1) do (
    set _FILE=%~2%DOT%%%i
    if exist !_FILE! (
        if %%i equ %3 (
            rem ファイルの世代番号が最大の場合、ファイルを削除する
            del /Q  "%~1\!_FILE!" >nul
        ) else (
            rem ファイルの世代番号が最大ではない場合、世代をアップする
            set /a _NEXT_COUNT=%%i+1 
            move /Y %~1\!_FILE! %~1\%~2%DOT%!_NEXT_COUNT! >nul
        )
    )
)

rem 最新のファイルは世代番号に1を付ける
set _FILE=%~2%
move /Y "%~1\!_FILE!" "%~1\%~2%DOT%1" >nul

endlocal
exit /b

FileRotateSize.bat

@setlocal enabledelayedexpansion
@echo off

rem ******************************************************************
rem * FileRotateSize.bat: ファイルサイズによるローテート
rem * %1: ファイルのフォルダ C:\work\log
rem * %2: ファイル名 Error.log
rem * %3: 最大の世代数
rem * %4: ファイルの最大バイト数
rem ******************************************************************
rem echo FileRotateSize %1 %2 %3 %4

for %%i in (%~1\%~2) do (
    rem echo %%~zi
    if %%~zi gtr %4 (
        call FileRotate.bat %1 %2 %3
    )
)

exit /b

実行用.bat

@setlocal
@echo off

rem ファイルの最大バイト数
set MAX_BYTESIZE=10000000
rem 最大の世代数
set MAX_AGE=10

set FILE_DIR=C:\work\log
set FILE_NAME=Error.log

call FileRotateSize.bat "%FILE_DIR%" "%FILE_NAME%" %MAX_AGE% %MAX_BYTESIZE%

endlocal
exit /b