1

我有一个 IIS 应用程序,它使用 TraceEventSession 来捕获 ETW 消息并将它们转发到日志文件中:-

TraceEventSession _etwSession = new TraceEventSession(
   "MyEtwLog", @"C:\Logs\MyEtwLog.etl") { 100 };
_etwSession.EnableProvider(
   TraceEventProviders.GetEventSourceGuidFromName, "MyEtwLog"),
   TraceEventLevel.Always);

它工作正常,但由于某种原因,每次我重新启动应用程序时,它都会覆盖日志文件而不是附加到它。知道我错过了什么吗?

提前致谢

4

2 回答 2

6

免责声明:我在 Microsoft 内部为 TraceEvent 做出了贡献

可以使用EVENT_TRACE_FILE_APPEND_MODE附加到 ETW 文件,TraceEvent 目前不支持。我们可能会添加它,但我可以看到公开 API 的问题多于不公开。

TL;DR -- 带有元数据的完整 ETW 会话记录到每个文件中,每个会话可以有不同的选项,例如时钟分辨率,例如,这可能会导致细微的时间戳不准确,这可能会引起您的注意并导致您对一点。

这是我推荐的。我已经进入睡眠状态,但您需要设置一些逻辑来决定如何旋转文件(例如跟踪 IIS 实例何时刷新)。

var _etwSession = new TraceEventSession("MyEtwLog", @"C:\Logs\MyEtwLog." + MyTimestamp + ".etl");
_etwSession.EnableProvider(new Guid("MyGuid"), TraceEventLevel.Always);

Thread.Sleep(1000 * 60);

_etwSession.SetFileName(@"C:\Logs\MyEtwLog" + timestamp + ".etl");

一点背景:

ETW 文件是二进制消费者数据(您的日志消息),然后是 ETW 子系统提供的元数据,每条日志消息都可以免费获得。像 ThreadID,逻辑处理器编号,无论是来自内核还是用户模式,最后但最重要的是时间戳,它实际上是一个取决于处理器频率的值。

除了上述之外,ETW 文件“rundown”,就像操作系统的状态一样,也在会话开始和结束时刷新到文件中。

尽管事实上大多数消费者认为 ETW 日志就像是普通的日志,但它们有点不是。它们与跟踪的时间密切相关(请记住,ETW 最初主要用于 Windows 内核团队的性能分析)。最近这方面的情况有所改善,因此文件可以完全独立处理,并且很可能是为了您的目的。

但我可以想象在很多情况下附加到同一个文件不是一个好主意。

哦,还有一个大的。每次都从头到尾顺序读取 ETW 文件。那就是它会继续增长,你不能在中间阅读它,至少不是以受支持的方式:-)

最后你仍然不想追加,因为假设你写了一个日志文件 foo.etl,然后你去购买一个新的处理器并追加到这个日志文件,你在上一个会话中收集的所有时间戳都将关闭一些数字。

于 2014-10-10T21:40:30.277 回答
0

我不认为你缺少任何东西。无法使用TraceEventSession. 将不同的文件合并在一起TraceEventSession.Merge是可能的,但只有当它们来自同一台机器并且同时没有重新启动时才会产生正确的结果。

在 ETW API 中,如果您想在TraceEventSession.

于 2014-08-27T19:54:27.800 回答