バッチファイルで日毎のログ出力
バッチファイルで日毎のログ出力をする方法を紹介します。
コーディング例
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で作成しておく必要があります。
以上「バッチファイルで日毎のログ出力」の紹介でした。