EventLog を取得する方法 ~ とにかくイベントログを早くゲットしたい! ~

皆様ごきげんよう。ういこです。

今日は微妙にお問い合わせが多く、それでいて環境ごとに動作に差異が出やすい「イベントログの取得」についてのお話です。
イベントログの監視などを行う際、皆さんはどんな手段をご利用されていますでしょうか。
Technet のスクリプト センターでは、WMI を使っているような気がします。

実際、ネットに数多くあるステキなサンプルなども、WMI を使って取るものが多いかと思います。
WMI は、C++ で使うと鬼のように厳しいですが、Script などで使うとあら不思議あっという間に優しい子になります。そんなこともあり、巷では WMI でログを取るのが多いんだろうなぁと思います。(C++ だったら、後述の API 使ったほうがたぶん楽なきがするです)

しかし、そんな優しい彼女 (WMI) も、ひとつ致命的ともいえるかもしれない欠点が…。
そう、鬼 の よ う に 鈍 く さ い の で す
そんなわけでイライラ~な気分な方も多くいらっしゃるのではないでしょうか。
そこで、WMI よりも高速にイベント ログを取得する手段につきまして検討してみたいと思います。しかし、残念なことに、現行巷で元気に動作中の OS のバージョンすべてを網羅する手段はありませんでした。ただし、それぞれ Windows XP 以前とそれ以降で、それぞれ手段を変えれば、うまくいきそうです。

はじめに : イベントログは OS によってベーステクノロジが違いますです

Windows のイベント ビューアの内部動作
Windows のイベント ビューアは、Win32 API で実装されています。可能な限り効率的なイベント ログ アクセス、および画面描画処理を実現するために、独自のアルゴリズムによって設計、実装されています。だからとても早いのです。
なお、Windows XP 以前の OS と Windows Vista 以降で、イベント関連の処理を行う Win32 API 群が異なります。
これがポイントになります。

Windows XP 以前 : Windows Event Logging API (旧版)
Windows Vista 以降 : Windows Event Logging API (Windows Eventing 6.0 対応)

なぜ全 OS 共通の対応ができないか。それは、このように OS ごとにテクノロジが違うという背景があるからなのです。

イベント ログを読み取り管理するテクノロジの概要
https://msdn.microsoft.com/ja-jp/library/bb671205.aspx

(1) イベントログを取る手段
イベントログ取得手段は、以下の 5 つがあります。

1. .NET Framework クラス ライブラリの EventLog クラス
2. Windows Management Instrumentation (WMI)
3. .NET Framework クラス ライブラリの Eventing.Reader.EventLogReader クラス
4. Log Parser (Interop.MSUtil.dl) ユーティリティ
5. Win32 API の **EventLog** API

それぞれ、使えるプラットフォーム(OS のバージョン)、使えるシチュエーションが異なります。
では、それぞれ見てみましょう。

(2) それぞれの「使える」シチュエーションって?

1. .NET Framework クラス ライブラリの EventLog クラス
VBScript など、スクリプト ホストからは直接呼べません。
また、イベントログのレコードごとチェックする必要があるなど低速であるのが玉に瑕です。
ただ、C#、Visual Basic (除く Visual Basic 6.0)、PowerShell などで使うのにもってこいです。

2. WMI
WMI は、ご存知のとおりメソッドの実行そのものに時間を要します。
ただし、他のテクノロジと比しても、サンプルなどが豊富で使用方法が容易なため、ご利用頂きやすいという大きなアドバンテージがあります。
通常、C++ / VBScript などから呼ぶのが一般的かと思います。

3. .NET Framework クラス ライブラリの Eventing.Reader.EventLogReader クラス (Windows Vista 以降)
VBScript など、スクリプト ホストからは直接呼べません。
Windows Vista 以降の Windows Eventing 6.0 対応のため、Windows XP および 2000 では使用することができないという欠点がありますが、こちらは、WMI や、1. の EventLog クラスと比較すると高速にログの取り扱いが可能です。

4. Log Parser (Interop.MSUtil.dl) ユーティリティ
上記 3. と比較すると速度は劣るというお客様からのご意見などがありましたが、WMI や 1. 項と比較すると高速です。
ただし、インストールなどが必要になるため、運用サーバに導入する際に検討が必要という会社様もあるかもしれません。
ツールであるためサポート対象とはならない、また Windows Vista 以降には対応していないという点がありますが、Windows XP および 2000 での選択肢としては現時点では非常に有用です。

5. Win32 API の **EventLog** API Visual C++ などで使うにはよいです。でも、VBScript や C# など .NET Framework ベースから呼ぶのは面倒くさいです。

さて、このようにいろいろ違いがあることはわかりました。
ただ、サポートでお問い合わせを見ていて多いのは、やはり Windows Server 2003 および XP の環境でのスクリプト運用がぶっちぎりです。
今回は、管理者様を対象とした本サイトとして、Log Parser を取り上げてみたいと思います。

(4) Log Parser とは

このツール、実はかなり古くからあります。そのため、サイトなどでも比較的サンプルは多く取り上げられているようです。後述のスクリプト センターなどにも説明があります。(後述に URL あり)

Log Parser は、SQL や WMI で使用する WQL と同様のクエリを用いてイベント ログの他、レジストリ、ファイル検索などを高速・容易に扱うことができるユーティリティです。
以下のサイトよりダウンロードいただきインストール後、スクリプトでご利用頂く場合はスクリプトで参照するためのファイルである "LogParser.dll" を regsvr32 コマンドでシステムに登録して頂くことでスクリプトで機能を使うことができるようになります。 ヘルプファイルの内容も充実しているようです。

Log Parser 2.2 日本語版
https://www.microsoft.com/downloads/details.aspx?FamilyID=890cd06b-abf8-4c25-91b2-f8d975cf8c07&DisplayLang=ja

サポートされているオペレーティング システムは下記のとおりです。

・Windows 2000
・Windows Server 2003
・Windows XP Professional Edition

※注意
Log Perser は、弊社からのサポートその他のサービス、情報等の提供はさせていただいておりません旨、同梱の EULA.rtf に記載されております。

Log Parser 参考ドキュメントは弊社外サイトでも多数ございますが、下記はマイクロソフトの公式ページにある内容となります。

スクリプト センター
Log Parser 2.2 日本語版

https://www.microsoft.com/japan/technet/scriptcenter/tools/logparser/default.mspx

Professor Windows ‐ 2005 年 5 月
Log Parser 2.2 の動作方法

https://technet.microsoft.com/ja-jp/library/bb878032.aspx

Tales from the Script
2005 年 1 月
ログこそすべて (Log Parser について)

https://www.microsoft.com/japan/technet/community/columns/scripts/sg0105.mspx
※ DLL の登録、使用までの流れなどが記載されております。

WMI でのスクリプトが遅い!という管理者様はぜひ Log Parser をご利用してみてください。

ういこう@た~か~の~つ~め~…が耳についてしょうがない