使用ETWTraceEventSource读取循环ETW日志文件

时间:2015-03-18 10:42:35

标签: c# winforms logging etw etw-eventsource

短版 - 为什么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)上重现了这一点。

帮助!!!

1 个答案:

答案 0 :(得分:1)

作为Tx (LINQ to logs and traces)库的开发者之一,我建议使用其官方LINQpad驱动程序来查询etl文件。 This piece of documentation应该是一个良好的开端。诅咒你可以将它与你的windforms应用程序集成。

另一种选择是使用基于Tx构建的ETW E2E查看器SvcPerf工具,因此您根本不必编写自己的工具。

在这两种情况下,您只需要有etl和manifest文件。

在您的特定情况下,我认为问题如下 - 动态处理程序可以消灭实际事件有效负载,但它需要首先从会话中读取清单。我会检查清单是否到位,并且在EventSource本身发出的ETW流中没有诊断错误。