0
1

More than 3 years have passed since last update.

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

Posted at

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

使い方・実行結果

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

おわりに

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

ではでは!

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1