短版 - 为什么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)上重现了这一点。
帮助!!!
答案 0 :(得分:1)
作为Tx (LINQ to logs and traces)库的开发者之一,我建议使用其官方LINQpad驱动程序来查询etl文件。 This piece of documentation应该是一个良好的开端。诅咒你可以将它与你的windforms应用程序集成。
另一种选择是使用基于Tx构建的ETW E2E查看器SvcPerf工具,因此您根本不必编写自己的工具。
在这两种情况下,您只需要有etl和manifest文件。
在您的特定情况下,我认为问题如下 - 动态处理程序可以消灭实际事件有效负载,但它需要首先从会话中读取清单。我会检查清单是否到位,并且在EventSource本身发出的ETW流中没有诊断错误。