短いバージョン- 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) でもこれを再現しました。
ヘルプ!!!