バッチファイルで日毎のログ出力
バッチファイルで日毎のログ出力をする方法を紹介します。
コーディング例
test.bat
@ECHO OFF
SET LOCAL
REM ログ出力フォルダパス
SET LogDir=%~dp0Log\
REM ログファイルパス
SET LogPath=%LogDir%%~n0_%DATE:/=%.log
REM ログ保管日数
SET LogKeepDays=3
REM ログフォルダの作成
IF NOT EXIST "%LogDir%" (
MKDIR "%LogDir%"
)
REM ログ出力
CALL :WriteLog "ログ出力"
REM ログファイル削除
ECHO WScript.Echo DateAdd(Wscript.Arguments(0), Wscript.Arguments(1), Wscript.Arguments(2))>DateAdd.vbs
FOR /F %%A IN ('cscript //Nologo DateAdd.vbs d -%LogKeepDays% %DATE%') DO SET YMD=%%A
FOR %%B IN ("%LogDir%%~n0_*.log") DO (
IF "%%~tB" LEQ "%YMD%" (
DEL /F /Q %%B
)
)
DEL /F /Q DateAdd.vbs
EXIT /B
REM ログ出力サブルーチン
:WriteLog
ECHO %DATE% %TIME% %~1 >> %LogPath%
EXIT /B
実行結果
カレントフォルダにLogフォルダが作成され、その配下にログファイルが作成されます。

ログファイルの中身は以下のように出力されます。

8行目の「SET LogPath=%LogDir%%~n0_%DATE:/=%.log」で、ログファイル名をバッチファイル名(拡張子除く)「%~n0」、アンダースコア「_」、システム日付「%DATE:/=%」、拡張子「.log」を繋げたものを変数LogPathへセットしています。
システム日付の「%DATE:/=%」は、通常「%DATE%」ではyyyy/mm/dd形式で出力されるため、スラッシュ「/」を削除しています。
19行目の「CALL :WriteLog "ログ出力"」で34行目のラベル「:WriteLog」へジャンプし、35行目の「ECHO %DATE% %TIME% %~1 >> %LogPath%」で日付「%DATE%」、時刻「%TIME%」と第1引数「%~1」をログファイル「%LogPath%」へ追記し、36行目の「EXIT /B」で呼び出し元に処理を戻しています。
日毎にログ出力を行うとログファイルが溜まってしまうため、22~29行目では保存期間を過ぎたログファイルを自動で削除する処理を行っています。
22行目の「ECHO WScript.Echo DateAdd(Wscript.Arguments(0), Wscript.Arguments(1), Wscript.Arguments(2))>DateAdd.vbs」では、DOSコマンドでは日付加算できないので、日付加算を行うためのVBScriptファイル「DateAdd.vbs」を出力し、23行目の「FOR /F %%A IN ('cscript //Nologo DateAdd.vbs d -%LogKeepDays% %DATE%') DO SET YMD=%%A」でVBScriptを実行し3日前(%LogKeepDays%=3)の日付を、変数YMDにセットしています。
24行目の「FOR %%B IN ("%LogDir%%~n0_*.log")」でログフォルダ(%LogDir%)配下にある「test_*.log」という名前のファイルを検索し、該当するファイル名が「%%B」にセットされます。
25行目の「IF "%%~tB" LEQ "%YMD%"」で該当するファイルの更新日「%%~tB」が変数YMDの日付以前の場合、26行目の「DEL /F /Q %%B」で該当ファイルを削除しています。
注意点としてはバッチファイルの文字コードをSJISで作成しておく必要があります。
以上「バッチファイルで日毎のログ出力」の紹介でした。







