【bat】Windowsイベントログから特定のエラーを検出して通知する方法

【bat】Windowsイベントログから特定のエラーを検出して通知する方法 bat

Windowsでは、システムやアプリケーションの動作状況がイベントログに記録されています。トラブル発生時の調査や障害監視のために、このイベントログから特定のエラーを検出し、自動的に通知する仕組みを構築できると非常に便利です。

本記事では、バッチファイルを使ってイベントログから特定のエラーを検索し、見つかった場合に通知処理を実行する方法を紹介します。

イベントログの取得に使うコマンド:wevtutil

wevtutil は、Windowsに標準搭載されているイベントログ管理ツールです。ログのエクスポートや検索が可能で、バッチ処理と相性の良いコマンドです。

たとえば、システムログの中からイベントID「1001」(アプリクラッシュ)を含むログを検索するには以下のようにします。

wevtutil qe System /q:"*[System[(EventID=1001)]]" /f:text /c:1

/qオプションはXPath形式でのクエリ、/f:textはテキスト形式での出力、/cは取得件数を指定しています。

エラー検出と通知処理を組み込んだバッチ例

以下は、イベントID「1001」のエラーが検出された場合に、テキストログに記録し、必要に応じて外部通知(例:メールやメッセージ)に接続できる構造のバッチスクリプトです。

@echo off
setlocal

set "EVENT_ID=1001"
set "LOG_NAME=System"
set "TMP_FILE=tmp_eventlog.txt"
set "LOG_FILE=error_detected.log"

rem 最新のイベントを1件取得して一時ファイルに出力
wevtutil qe %LOG_NAME% /q:"*[System[(EventID=%EVENT_ID%)]]" /f:text /c:1 > %TMP_FILE%

rem 特定の文字列が含まれているかチェック
findstr /i "Event ID: %EVENT_ID%" %TMP_FILE% >nul
if %errorlevel% equ 0 (
    echo [%DATE% %TIME%] Event ID %EVENT_ID% が検出されました >> %LOG_FILE%
    echo 通知処理を実行中...

    rem (ここにメール送信やSlack通知などの処理を追加可能)

) else (
    echo [%DATE% %TIME%] 異常なし >> %LOG_FILE%
)

rem 一時ファイル削除
del %TMP_FILE%
endlocal

通知機能を追加する方法

通知機能は、次のような手段で追加できます。

  • PowerShellスクリプトを呼び出してメールを送信
    powershell -File sendmail.ps1 などで呼び出し
  • Webhook URL を使って Slack に投稿
    curl や PowerShell を利用して API 経由で通知
  • イベントログを別ファイルに転送する
    ログを共有フォルダに保存して他の監視サーバで処理

応用例:特定ソース・レベルのイベントを対象にする

イベントIDだけでなく、イベントの種類(レベル)やソース名でも条件を絞ることができます。たとえば、レベル「2(エラー)」かつソースが「Disk」のイベントを対象にするには次のようなクエリになります。

wevtutil qe System /q:"*[System[Provider[@Name='Disk'] and Level=2]]" /f:text /c:1

このように条件を複雑化することで、特定のハードウェア障害などをピンポイントで監視できます。

まとめ

バッチファイルと wevtutil を活用することで、特定のイベントログを検出して即時対応する仕組みを簡単に構築できます。特に次のような場面で効果を発揮します。

  • 重要なアプリケーションのクラッシュ検知
  • ディスクエラーやネットワーク障害の即時検知
  • 特定ユーザーのログオン・ログオフの監視

通知処理の部分はPowerShellや外部ツールと連携することで強化できるため、自社の運用に合わせてカスタマイズしやすいのも魅力です。監視業務の自動化の第一歩として、ぜひ活用してみてください。