wevtutil でイベントログをフィルタリングするサンプル

イベントビューワーは重すぎてイライラするので、wevtutil でサクっとフィルタリングできないかなと思って調べてみた。

前提

サンプル中で使ってる wevtutil のオプションは以下のとおり。

wevtutil qe System /c:1 /f:Text /rd:true

qe       ← イベントログからデータを取得する際に指定するオプション
System   ← Systemログから取ってくる
/c:1     ← 取得件数。1なら1件
/f:Text  ← 出力形式。デフォは XML で読み辛いので読みやすい Text に
/rd:true ← 新しい日付のログを先に表示するオプション

(1) 特定のイベントIDのみ

$ wevtutil qe System /c:1 /f:Text /rd:true /q:*[System[(EventID=6006)]]
Event[0]:
  ...
  Event ID: 6006
  ...
イベント ログ サービスが停止されました。

EventID を指定する。

(2) 特定のレベル(情報とかエラーとか)のみ

$ wevtutil qe System /c:1 /f:Text /rd:true /q:*[System[(Level=1)]]
Event[0]:
  Level: 重大

$ wevtutil qe System /c:1 /f:Text /rd:true /q:*[System[(Level=2)]]
Event[0]:
  Level: エラー

$ wevtutil qe System /c:1 /f:Text /rd:true /q:*[System[(Level=3)]]
Event[0]:
  Level: 警告

$ wevtutil qe System /c:1 /f:Text /rd:true /q:*[System[(Level=4)]]
Event[0]:
  Level: 情報

Level1 が一番深刻なやつで、Level4 が一番軽いやつ。Level5 以上は無いみたい。

(3) 比較演算子を使う(例:指定値以下のEventIDのみ)

$ wevtutil qe System /c:5 /f:Text /rd:true "/q:*[System[(EventID<=15)]]"
Event[0]:
  Event ID: 14

Event[1]:
  Event ID: 14

Event[2]:
  Event ID: 14

Event[3]:
  Event ID: 6

Event[4]:
  Event ID: 6

EventID が 15 以下のログを 5 件ほど取得。ここでは ID=14 と ID=6 の分がヒットしている。

(4) OR 演算子を使う

$ wevtutil qe System /c:2 /f:Text /rd:true "/q:*[System[(EventID=6006 or EventID=13)]]"
Event[0]:
  Event ID: 13

Event[1]:
  Event ID: 6006

(5) 発生時刻で絞り込む

$ wevtutil qe System /f:Text /rd:true "/q:*[System[TimeCreated[@SystemTime>='2018-04-16T00:00:00' and @SystemTime<='2018-04-18T00:00:00']]]"

Event[0]:
  Log Name: System
  Date: 2018-04-18T08:55:14.421

Event[1]:
  Date: 2018-04-18T08:55:10.659

...

Event[310]:
  Date: 2018-04-16T09:03:22.529

Event[311]:
  Date: 2018-04-16T09:01:22.581

18/04/16~18/04/18 の範囲でログを取っている……つもりだけど時刻部分( T00:00:00 )がちゃんと解釈されてないっぽい(2018-04-16T08:00:00 のログとかもあるのに表示されてない)。

どうやら GMTベースで指定する必要がある みたいだ。つまり JST の場合だと 9 時間を差っ引いた値で指定する必要がある、と。

(余談) 上記ブログ、他にもタメになることが書いてある。たとえばクエリを手探りで書くのは難しいからイベントビューアーの「現在のログをフィルター」を使って出力させてみるとわかりやすい、とか。

参考

おわりに

これくらいあればそこそこフィルタリングできるのではないかと思う。重たいイベントビューワーからおさらばできて快適。

p.s. 下手にフィルタの書き方で苦戦するくらいなら、

$ wevtutil qe System /f:Text /rd:true > system.txt

これでログ全部を system.txt に出してから、これをテキストエディタなり grep なりで調べる方が早いかもしれない。