鷲ノ巣

C# とか PowerShell とか。当ブログの記事は(特に公開直後は)頻繁に改定される場合があることをご了承ください。

Event Tracing for Windows …の前説

最近、Event Tracing for Windows (ETW) について調査しています。
で、今回から何回か続けて、ETW について書いて行きます。

ETW とは

ETW とは、アプリケーションやシステム(ドライバーなど)が、その動作上発生した何らかのイベントを、報告し、記録し、読み出し、処理するための仕組みです。
Windows 2000 で導入された後、Windows Vista で大きな更新が行われました。
このシリーズでは、より新しい、Vista 世代の ETW について採り上げていきます。

ETW は、アプリケーションのログを残すのにももちろん使えますが、OS やドライバーのログ、SQL Server のトレース ログ等にも利用されます。
また、Microsoft 製のネットワーク キャプチャ ソフトである Microsoft Message Analyzer なども、ETW の上に構築されています。
ということは、どういうネットワーク パケットが流れてきたかという情報を ETW に報告しているということです(Message Analyzer を使って ETW をモニタリングすることもできます)。
ETW の応用範囲の広さがわかると思います。

ETW と周辺技術

Windows には ETW 以外にも、いくつかのイベント処理技術があります。
MSDN では、Windows Events というカテゴリーにまとめられています。

  • Event Tracing
  • Event Logging
  • Windows Event Log
  • Windows Event Collector

簡単に、これらの技術について解説しましょう。

Event Tracing

タイトルに for Windows がついていませんが、これが ETW のことです。
今後詳しく採り上げていきますので、ここでは割愛します。

Event Logging

よく知られたイベント ログの仕組みです。
こちらのイベント ログは、Windows NT の頃から存在する古い仕組みです。

Windows Event Log

これもイベント ログに関する技術です。
Windows Vista から登場した新しいイベント ログの仕組みで、ETW をベースとしています。

Windows Event Collector

これは、あるコンピューターで発生したイベントを、別のコンピューターで読み取るための仕組みです。
HTTP (WinRM) 経由で通信を行い、複数のコンピューターのイベントを、一台のコンピューターで集中管理することができます。
これについては、この ETW 連載の最後に採り上げる予定です。

2 つのイベント ログ

前述の通り、Windows には新旧 2 つのイベント ログの仕組みがあります。
これらには、それぞれ異なる API が用意されています。

ここでは、代表的な API を比べてみましょう。

Event Logging(旧) Windows Event Log(新)
Win32 API ReportEvent 関数 EventWrite 関数
.NET Framework EventLog クラス EventSource クラス
PowerShell Get-EventLog コマンド Get-WinEvent コマンド

なお、Event Logging(旧イベント ログ)には、イベント ログを読み書きするための API が用意されていますが、Windows Event Log(新イベント ログ)の方には、書きこみ API は用意されていません。
新イベント ログにイベントを書きこむためには、ETW の API を利用します。

イベント ビューアーとの関連

f:id:aetos382:20140909151245p:plain

左側のツリーで

  • 上にある「Windows ログ」が Event Logging(古いイベント ログ)
  • 真ん中の「アプリケーションとサービス ログ」が Windows Event Log(ETW ベースの新しいイベントログ)
  • 一番下の「サブスクリプション」が Windows Event Collector

に関連しています。

イベント ログは以上

なんだかイベント ログ特集みたいになってしまいましたが、Windows Event Log(新イベント ログ)と ETW はイコールではないので、今後、イベント ログに関することはあまり書かない予定です。
イベント ビューアーは適宜使いますけどね。

Event Logging(旧イベントログ)については、ETW とはほとんど関係がありませんので、多分もう出番はありません。

次回からは、ETW に絞った話をして行きます。

ちなみに、コードはアンマネージド(C++ と Win32 API)が中心になります。