1

TraceEventSession を使用して ETW メッセージをキャプチャし、ログ ファイルに転送する IIS アプリケーションがあります。

TraceEventSession _etwSession = new TraceEventSession(
   "MyEtwLog", @"C:\Logs\MyEtwLog.etl") { 100 };
_etwSession.EnableProvider(
   TraceEventProviders.GetEventSourceGuidFromName, "MyEtwLog"),
   TraceEventLevel.Always);

正常に動作していますが、何らかの理由でアプリを再起動するたびに、ログ ファイルに追加する代わりに上書きします。私が見逃しているものはありますか?

前もって感謝します

4

2 に答える 2

6

免責事項: Microsoft の内部で TraceEvent に貢献しています。

TraceEventが現在サポートしていない EVENT_TRACE_FILE_APPEND_MODE使用して、ETW ファイルに追加できます。追加する可能性はありますが、API を公開することには、公開しないことよりも多くの問題があることがわかります。

TL;DR -- メタデータを含む完全な ETW セッションは、各ファイルに記録されるものであり、各セッションにはクロック解像度などのさまざまなオプションを設定できます。いくつかのポイント。

これが私が推奨するものです。私はスリープ状態にしましたが、ファイルをローテーションする方法を決定するためのロジックをいくつか入れます (IIS インスタンスがいつ更新されるかを追跡するなど)。

var _etwSession = new TraceEventSession("MyEtwLog", @"C:\Logs\MyEtwLog." + MyTimestamp + ".etl");
_etwSession.EnableProvider(new Guid("MyGuid"), TraceEventLevel.Always);

Thread.Sleep(1000 * 60);

_etwSession.SetFileName(@"C:\Logs\MyEtwLog" + timestamp + ".etl");

少し背景:

ETW ファイルは、バイナリ コンシューマー データ (ログ メッセージ) であり、ETW サブシステムによって提供されるメタデータであり、すべてのログ メッセージが無料で取得されます。ThreadID と同様に、カーネル モードまたはユーザー モードから取得した論理プロセッサ番号、そして最後に最も重要なのはタイムスタンプです。これは実際にはプロセッサの周波数に依存する値です。

上記に加えて、ETW ファイルの「ランダウン」は、オペレーティング システムの状態と同様に考えて、セッションの開始時と終了時にファイルにフラッシュされます。

ほとんどの消費者は、ETW ログは単なるログのようなものだと考えていますが、実際にはそうではありません。これらは、トレースが取得された時間と密接に結びついています (当初、ETW は主に Windows カーネル チームによるパフォーマンス分析に使用されていたことを思い出してください)。最近、ファイルを完全に独立して処理できるようになり、目的に合わせて処理できるようになりました。

しかし、同じファイルに追加するのが得策ではない多くのケースを想像できます。

ああ、そしてもう一つ大きなもの。ETW ファイルは、毎回最初から最後まで順番に読み取られます。つまり、それは成長し続け、少なくともサポートされている方法では、途中で読み取ることはできません:-)

最後に、ログ ファイル foo.etl を書き込んでから、スパンキングの新しいプロセッサを購入し、このログ ファイルに追加することを想像してみてください。以前のセッションで収集されたすべてのタイムスタンプは、いくつかの数。

于 2014-10-10T21:40:30.277 に答える