【bat】バッチファイルでエラーログを自動収集して保存する方法

bat

バッチファイルでは、処理の実行中に発生したエラーを自動で記録し、後で確認できるようにログファイルとして保存することができます。特に定期実行するバッチ処理では、画面に表示されるだけのエラーは見落としやすいため、ログを残す仕組みを組み込んでおくと運用が効率的になります。ここではエラーログを自動収集して保存する方法を解説します。

標準出力とエラー出力の違い

コマンドの実行結果には2種類の出力があります。通常のメッセージを出す「標準出力(stdout)」と、エラーを出す「標準エラー出力(stderr)」です。バッチファイルではリダイレクトを使ってそれぞれをログに保存できます。

:: 標準出力をログに保存
dir C:\ > success.log

:: エラー出力をログに保存
dir Z:\ > error.log 2>&1

この例では存在しないドライブZ:\を指定しているため、エラーメッセージがerror.logに書き込まれます。

エラーのみをログに保存する

エラー出力(stderr)だけを別ファイルに保存するには「2>」を使います。

@echo off
setlocal

:: 成功出力は画面、エラーはファイルに記録
copy C:\test\file.txt D:\backup\ 2> error.log

endlocal
pause

成功と失敗を分けてログに記録する

stdoutとstderrを別々のログファイルに分けて保存することも可能です。

@echo off
setlocal

:: 成功メッセージをsuccess.log、エラーメッセージをerror.logへ
robocopy C:\test D:\backup /E > success.log 2> error.log

endlocal
pause

実行日時をログに残す

ログを確認しやすくするために、処理の実行日時も一緒に記録しておくと便利です。

@echo off
setlocal

set "log=error_%date:~0,10%_%time:~0,2%%time:~3,2%.log"
echo [%date% %time%] バッチ処理を開始します >> "%log%"

copy C:\test\file.txt D:\backup\ 2>> "%log%"

echo [%date% %time%] バッチ処理を終了しました >> "%log%"

endlocal
pause

この例ではファイル名に日付と時刻を付け、処理の開始と終了も追記しています。

複数コマンドのエラーログをまとめる

大きなバッチ処理では複数のコマンドを実行します。それぞれのエラーを1つのログファイルに集約しておくと管理しやすくなります。

@echo off
setlocal

set "log=errorlog.txt"
echo ==== 実行開始 [%date% %time%] ==== >> "%log%"

copy C:\test\file1.txt D:\backup\ 2>> "%log%"
del C:\test\file2.txt 2>> "%log%"
xcopy C:\test\*.txt D:\backup\ 2>> "%log%"

echo ==== 実行終了 [%date% %time%] ==== >> "%log%"

endlocal
pause

まとめ

バッチファイルでエラーログを自動収集するには「リダイレクト」を使うのが基本です。2>でエラー出力を指定し、ログファイルに追記(>>)することで複数のエラーをまとめられます。日付や時刻を組み合わせておけば、実行履歴を管理しやすくなり、トラブルシューティングに役立ちます。