免责声明:我在 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,然后你去购买一个新的处理器并追加到这个日志文件,你在上一个会话中收集的所有时间戳都将关闭一些数字。