Y子です。
Windowsのイベントログをエクスポートするバッチファイルを作ってみました。
障害発生時の原因切り分けや、保守期間の稼働状況調査のために、OSのイベントログを持ち帰る、という用途を想定します。
【確認環境:Windows 10 Home (Bld. 19042.928)】
#仕様
- システムログ、アプリケーションログをファイル化する
- 7日以上分をファイル化する
- EVTX形式とTXT形式でファイル化する
「7日以上分」は、今日が月曜としたら、「前の週の月曜の0時から現在まで」の期間とします。
「EVTX形式」とは、ダブルクリックするとWindowsの「イベントビューアー」で表示できる形式です。
#コード
@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形式の両方を保存するコードですが、正直なところ、どちらかがあればよいと思います。
使い勝手の良い方を残してお使いください。
#使い方・実行結果
収集したいタイミングで実行したり、タスクスケジューラーに登録して定期的に実行したりします。
ログの蓄積状況によりますが、数秒で指定ファイルが保存されます。
#おわりに
どちらかと言うと、保守よりは開発が楽しいと思う性分なので、イベントログってあんまり見ないんですよね…。
ただまあ、アプリケーションが残すログで判断がつかない事象は、イベントログを確認することになるので、最後に頼るもの、というイメージがあります。
ローテートされて消えちゃう前にファイル化しておく、そのための今回のバッチファイルです。
だいじ。
ではでは!