バッチファイルでログローテート


システム運用で忘れちゃいけないのがログのローテーション。
Windowsにはlinuxみたいにlogrotateが実装されていないので、バッチファイルで実現します。

logrotate.bat
@echo off
cd /d %~dp0

:: ローテしたいファイル(バッチを置いた場所に応じて、絶対パスまたは相対パスを渡す)
set LogFile=%1
:: 超えたらローテさせるByte数(例:1048576 = 1MB)
set LimitByte=%2

call :getTimeStamp
call :checkFileSize "%LogFile%"

if %FileSize% gtr %LimitByte% (
    rem ローテーション
    move "%LogFile%" "%LogFile%_%TimeStamp%"
)

exit /b

:: ファイルサイズチェック
:checkFileSize
    setlocal
    endlocal & set FileSize=%~z1
exit /b

:: タイムスタンプの取得
:getTimeStamp
    setlocal

    set YYYY=%DATE:~0,-6%
    set MM=%DATE:~5,-3%
    set DD=%DATE:~-2%
    set /a H=%TIME:~0,-9%
    set M=%TIME:~3,-6%
    set S=%TIME:~6,-3%
    if %H% lss 10 (
        set H=0%H%
    )
    endlocal & set TimeStamp=%YYYY%%MM%%DD%-%H%%M%%S%
exit /b

第二引数のバイト数にゼロを渡せば問答無用でローテーションします。
実行してみる。

>type nul > 0Byte.txt
>fsutil file createnew 1MByte.txt 1048576
>fsutil file createnew 5MByte.txt 5242880

>dir
2019/04/05  12:10    <DIR>          .
2019/04/05  12:10    <DIR>          ..
2019/04/05  12:05                 0 0Byte.txt
2019/04/05  12:07         1,048,576 1MByte.txt
2019/04/05  12:07         5,242,880 5MByte.txt
2019/04/05  12:02               739 logrotate.bat

>logrotate.bat 0Byte.txt 1024
>logrotate.bat 1MByte.txt 0
        1 個のファイルを移動しました。
>logrotate.bat 5MByte.txt 5242881
>logrotate.bat 5MByte.txt 5242879
        1 個のファイルを移動しました。

>dir
2019/04/05  12:17    <DIR>          .
2019/04/05  12:17    <DIR>          ..
2019/04/05  12:05                 0 0Byte.txt
2019/04/05  12:07         1,048,576 1MByte.txt_20190405-121649
2019/04/05  12:07         5,242,880 5MByte.txt_20190405-121743
2019/04/05  12:16               782 logrotate.bat

タスクスケジューラに組み込んだりして使ってください。