2

短いバージョン- ETWTraceEventSource が 100 MB の循環ログ ファイルに対して 0 のログ エントリを返すのはなぜですか?

長いバージョン- ETW ログを使用するように IIS アプリケーションを変更しました (nuget パッケージを使用)。私のイベントソースは次のようになります: -

[EventSource(Name = "MyEtwLog")]
public class MyEtwSource : EventSource
{
   [Event(1, Level = EventLevel.Verbose)]
   public void Debug(string message) { WriteEvent(1, message); }
   [Event(2, Level = EventLevel.Informational)]
   public void Info(string message) { WriteEvent(2, message);  }
   [Event(3, Level = EventLevel.Warning)]
   public void Warn(string message) { WriteEvent(3, message); }
   [Event(4, Level = EventLevel.Error)]
   public void Error(string message)  { WriteEvent(4, message); }
   [Event(5, Level = EventLevel.Critical)]
   public void Fatal(string message) { WriteEvent(5, message); }
}

そして、次のようなプロバイダーを有効にするセッションがあります: -

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

IIS の機能はすべて正常に動作しています。これらのログを表示するための winforms アプリケーションを作成するように依頼された (ユーザーは PerfView を好まない) ため、次のコードを作成しました。

using (ETWTraceEventSource source = new ETWTraceEventSource(@"C:\Logs\MyEtwLog.etl"))
{
   source.Dynamic.All += arg =>
   {
      // Process log entry
   }
   source.Process();
}

ユーザーはこれらのログを 10 個作成し、自分のマシン (Windows 8.1) ではそのうちの 8 個がアプリに完全にロードされます。残りの 2 つは 100 MB で、ログ エントリは表示されません。それらを PerfView で開くと、ファイルに問題はなく、すべてのログ エントリがそこにあることがわかります。

私のマシン(Windows 8.1も)でそれらをデバッグしても、「プロセスログエントリ」でコードにヒットすることはありません。多くの試行錯誤の後、Dynamic.All の代わりに AllEvents を使用するとうまくいくことがわかりました。

source.AllEvents += arg =>
{
   // Log entries, woo!!!
}

これがテスト マシン (Windows 7) で正常に動作することを確認しましたが、アプリをユーザーに戻すと、まったく同じ問題が発生します。Windows 2008 R2 マシン (.net 4.5.2) と Windows 7 マシン (.net 4.5.1) でもこれを再現しました。

ヘルプ!!!

4

1 に答える 1