ログファイルの監視と自動処理を行うバッチファイルの作成方法

ログファイルの監視と特定のログが出力された際の自動処理は、システム管理者や開発者にとって重要なタスクの一つです。Windows環境において、これを実現する手段としてバッチファイルを使用する方法を紹介します。この記事では、ログファイルを監視して特定のログが出力された場合に自動的に処理を行うバッチファイルを作成する手順を解説します。

ログファイルの監視設定

まず、特定のログファイルを監視するために、Windowsの標準コマンドである findstr を利用します。これにより、ログファイル内の文字列を検索し、特定の文字列が含まれているかどうかを確認します。

特定のログが出力された場合の処理設定

ログファイル内で特定の文字列が見つかった場合に実行する処理を記述します。例えば、別のバッチファイルを呼び出したり、必要なアクションを実行したりします。

バッチファイルの定期実行設定

作成したバッチファイルを定期的に実行するように設定します。これにより、ログファイルが定期的に監視され、特定のログが出力された場合に自動処理が行われます。

サンプルコード

以下に、ログファイルの監視と自動処理を行うバッチファイルのサンプルコードを示します。このコードをカスタマイズして、自身の環境に適した設定を行ってください。

@echo off
rem --- 設定 ---
set "logfile=log.txt"         rem 監視するログファイルのパス
set "searchstring=ERROR"      rem 検索する文字列
set "errorhandler=error_handling.bat"  rem エラー時に実行するバッチファイル

rem --- 監視ループ ---
:monitor
rem ログファイル内で検索
findstr /C:%searchstring% "%logfile%" >nul 2>&1
if %errorlevel% equ 0 (
    rem エラーハンドラの実行
    call %errorhandler%
)
rem 10秒待機してから再度監視
timeout /t 10 /nobreak >nul
goto monitor

ループ回数に上限を設定

以下のように、ループ回数の上限を設定したバッチファイルを示します。ここでは、loop_limit 変数にループの上限回数を設定し、それを超えた場合にスクリプトが終了するようにしています。

@echo off
rem --- 設定 ---
set "logfile=log.txt"         rem 監視するログファイルのパス
set "searchstring=ERROR"      rem 検索する文字列
set "errorhandler=error_handling.bat"  rem エラー時に実行するバッチファイル
set "loop_limit=100"          rem ループの上限回数

rem --- 監視ループ ---
setlocal enabledelayedexpansion
set /a "count=0"

:monitor
rem ログファイル内で検索
findstr /C:%searchstring% "%logfile%" >nul 2>&1
if %errorlevel% equ 0 (
    rem エラーハンドラの実行
    call %errorhandler%
)
rem カウントを増やす
set /a "count+=1"

rem ループ回数が上限に達した場合は終了
if !count! gtr %loop_limit% (
    echo 上限回数に達しました。スクリプトを終了します。
    goto :eof
)

rem 10秒待機してから再度監視
timeout /t 10 /nobreak >nul
goto monitor

監視時間に上限を設定

監視時間に上限を設定するには、監視開始時刻から一定の時間が経過したかどうかをチェックする必要があります。以下のように、開始時刻を記録し、それに一定の時間を加えた時刻を超えたらスクリプトを終了する方法があります。

@echo off
rem --- 設定 ---
set "logfile=log.txt"         rem 監視するログファイルのパス
set "searchstring=ERROR"      rem 検索する文字列
set "errorhandler=error_handling.bat"  rem エラー時に実行するバッチファイル
set "monitor_duration=3600"   rem 監視する時間の上限(秒)

rem --- 監視開始時刻 ---
set "start_time=%time%"

rem --- 監視ループ ---
:monitor
rem 現在時刻を取得
for /f "tokens=1-4 delims=:.," %%a in ("%time%") do (
    set /a "current_time=(((%%a*60)+1%%b %% 100)*60)+1%%c %% 100"
)

rem 監視する時間の上限を超えた場合は終了
set /a "monitor_duration_seconds=%monitor_duration%"
if !current_time! gtr %monitor_duration_seconds% (
    echo 監視時間の上限に達しました。スクリプトを終了します。
    goto :eof
)

rem ログファイル内で検索
findstr /C:%searchstring% "%logfile%" >nul 2>&1
if %errorlevel% equ 0 (
    rem エラーハンドラの実行
    call %errorhandler%
)

rem 10秒待機してから再度監視
timeout /t 10 /nobreak >nul
goto monitor

開始時間と終了時間を設定する

指定された開始時間から自動的に監視を開始し、指定された終了時間が到達すると自動的に終了するようにします。

@echo off
rem --- 設定 ---
set "logfile=log.txt"         rem 監視するログファイルのパス
set "searchstring=ERROR"      rem 検索する文字列
set "errorhandler=error_handling.bat"  rem エラー時に実行するバッチファイル
set "start_time=09:00:00"     rem 監視を開始する時間
set "end_time=18:00:00"       rem 監視を終了する時間

rem --- 開始時間の確認 ---
:check_start_time
for /f "tokens=1-3 delims=:" %%a in ("%time%") do (
    set /a "current_hour=1%%a %% 100"
    set /a "current_minute=1%%b %% 100"
    set /a "current_second=1%%c %% 100"
)
set /a "start_hour=1%start_time:~0,2% %% 100"
set /a "start_minute=1%start_time:~3,2% %% 100"
set /a "start_second=1%start_time:~6,2% %% 100"

if %current_hour% lss %start_hour% (
    timeout /t 1 /nobreak >nul
    goto :check_start_time
) else if %current_hour% equ %start_hour% (
    if %current_minute% lss %start_minute% (
        timeout /t 1 /nobreak >nul
        goto :check_start_time
    ) else if %current_minute% equ %start_minute% (
        if %current_second% lss %start_second% (
            timeout /t 1 /nobreak >nul
            goto :check_start_time
        )
    )
)

rem --- 監視ループ ---
:monitor
rem 現在時刻の確認
for /f "tokens=1-3 delims=:" %%a in ("%time%") do (
    set /a "current_hour=1%%a %% 100"
    set /a "current_minute=1%%b %% 100"
    set /a "current_second=1%%c %% 100"
)

rem 終了時間の確認
set /a "end_hour=1%end_time:~0,2% %% 100"
set /a "end_minute=1%end_time:~3,2% %% 100"
set /a "end_second=1%end_time:~6,2% %% 100"

rem 監視を終了するかどうかの判定
if %current_hour% gtr %end_hour% (
    echo 監視を終了します。
    goto :eof
) else if %current_hour% equ %end_hour% (
    if %current_minute% gtr %end_minute% (
        echo 監視を終了します。
        goto :eof
    ) else if %current_minute% equ %end_minute% (
        if %current_second% gtr %end_second% (
            echo 監視を終了します。
            goto :eof
        )
    )
)

rem ログファイル内で検索
findstr /C:%searchstring% "%logfile%" >nul 2>&1
if %errorlevel% equ 0 (
    rem エラーハンドラの実行
    call %errorhandler%
)

rem 10秒待機してから再度監視
timeout /t 10 /nobreak >nul
goto monitor

まとめ

ログファイルの監視と自動処理を行うバッチファイルは、システム管理や開発作業を効率化する重要なツールです。この記事を参考にして、自身の環境に合わせたログ監視システムを構築してみてください。