バッチファイルでWindowsのイベントログをエクスポートする


Y子です。
Windowsのイベントログをエクスポートするバッチファイルを作ってみました。

障害発生時の原因切り分けや、保守期間の稼働状況調査のために、OSのイベントログを持ち帰る、という用途を想定します。
確認環境:Windows 10 Home (Bld. 19042.928)

仕様

  • システムログ、アプリケーションログをファイル化する
  • 7日以上分をファイル化する
  • EVTX形式とTXT形式でファイル化する

「7日以上分」は、今日が月曜としたら、「前の週の月曜の0時から現在まで」の期間とします。
「EVTX形式」とは、ダブルクリックするとWindowsの「イベントビューアー」で表示できる形式です。

コード

export_evtlog.bat
@echo off
setlocal

rem ログを取得する日数(昨日=1)
set backday=7

rem ログを保存するフォルダ
set savedir=.

rem GMT→JST変換のため、さらに1日前の15時をログ取得開始時刻とする
set /a backday=%backday%+1

set str_date=%date%
set str_date=%str_date:~0,4%%str_date:~5,2%%str_date:~8%

set str_time=%time: =0%
set str_time=%str_time:~0,2%%str_time:~3,2%%str_time:~6,2%

rem ファイル名(前半部分)作成 …保存先フォルダ名も結合しておく
set file_name_pre= %savedir%\%computername%_%str_date%_%str_time%

rem 「x日前」の日付文字列を作成
for /F "usebackq delims=" %%a in (`powershell "(get-date).AddDays(-%backday%).ToString(\"yyyy-MM-dd\")"`) do set tgt_date=%%a

rem ファイル保存(EVTX形式)
wevtutil epl system      %file_name_pre%_sys.evtx "/q:*[System[TimeCreated[@SystemTime>='%tgt_date%T15:00:00']]]"
wevtutil epl application %file_name_pre%_app.evtx "/q:*[System[TimeCreated[@SystemTime>='%tgt_date%T15:00:00']]]"

rem ファイル保存(TXT形式)
wevtutil qe system      /f:text "/q:*[System[TimeCreated[@SystemTime>='%tgt_date%T15:00:00']]]" > %file_name_pre%_sys.txt
wevtutil qe application /f:text "/q:*[System[TimeCreated[@SystemTime>='%tgt_date%T15:00:00']]]" > %file_name_pre%_app.txt

endlocal

説明

ログの取得日数を、backdayで7日間としてあります。必要に応じて変更してください。

ログを保存するフォルダはsavedirで定義して使います。
今回のコードの「.」のままだと、実行時のカレントフォルダに保存されますので、必要に応じて変更してください。

保存されるファイル名は、コンピュータ名_日付_時刻_種別.拡張子という形式にしてあります。
複数のPCからログを集めた際に分からなくならないよう、%computername%を使ってコンピュータ名を付けてあります。
日付時刻は、バッチファイルを実行した時刻が入ります。
種別は、システムログがsys、アプリケーションログがappとしてあります。
EVTX形式とTXT形式は、拡張子で区別してあります。

イベントログのエクスポートはwevtutilコマンドを使っています。
抽出期間の指定はGMTで行うため、日本時間の「7日前の0時」は、GMTの「8日前の15時」として指定します。
「n日前の日付」は、powershellを使って計算しています。

wevtutilコマンドに渡す条件式は文法が難しいですが、Windowsのイベントビューアーを使って作成できます。
イベントビューアーでシステムログ等を表示させ、「カスタムビューの作成...」から、条件に合うように「フィルター」を設定すると、そのフィルタの内容が「XML」タブに表示されます。
それが、そのまま条件式に使えます。

今回のコードでは、システムログ・アプリケーションログを例として扱っていますが、他にも多くのログをエクスポートすることができます。
Windowsのコマンドラインからwevtutil elを実行すると、指定できるログの候補が表示されます(わたしのPCでは1000種類以上!)。
ただし、権限がなかったり、蓄積していなかったりして、エクスポートできないログもあるようです。

EVTX形式とTXT形式の両方を保存するコードですが、正直なところ、どちらかがあればよいと思います。
使い勝手の良い方を残してお使いください。

使い方・実行結果

収集したいタイミングで実行したり、タスクスケジューラーに登録して定期的に実行したりします。
ログの蓄積状況によりますが、数秒で指定ファイルが保存されます。

おわりに

どちらかと言うと、保守よりは開発が楽しいと思う性分なので、イベントログってあんまり見ないんですよね…。
ただまあ、アプリケーションが残すログで判断がつかない事象は、イベントログを確認することになるので、最後に頼るもの、というイメージがあります。
ローテートされて消えちゃう前にファイル化しておく、そのための今回のバッチファイルです。
だいじ。

ではでは!