2

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

帮助!!!

4

1 回答 1

1

作为Tx(LINQ 到日志和跟踪)库的开发人员之一,我建议使用其官方LINQpad驱动程序来查询 etl 文件。这篇文档对您来说应该是一个好的开始。当然,你可以将它与你的 windforms 应用程序集成。

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

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

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

于 2015-04-15T17:22:07.960 回答