简短版- 为什么 ETWTraceEventSource 为 100mb 循环日志文件返回 0 个日志条目?
长版本- 我修改了一个 IIS 应用程序以使用 ETW 日志记录(使用 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 个是 100mb,没有显示任何日志条目。如果我在 PerfView 中打开它们,我可以看到文件没有任何问题,并且所有日志条目都在那里。
在我的机器上调试它们(也是 Windows 8.1)我从来没有在“进程日志条目”处点击代码。经过大量试验和错误后,我发现使用 AllEvents 而不是 Dynamic.All 可以:-
source.AllEvents += arg =>
{
// Log entries, woo!!!
}
我验证了这在我的测试机器(Windows 7)上可以正常工作,但是当我将应用程序传回给用户时,我遇到了完全相同的问题!我还在 Windows 2008 R2 机器 (.net 4.5.2) 和 Windows 7 机器(.net 4.5.1) 上重现了这个。
帮助!!!