ETW日志记录 - TraceEventSession将覆盖文件

Phi*_*ert 1 c# logging etw etw-eventsource

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

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

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

提前致谢

小智 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");
Run Code Online (Sandbox Code Playgroud)

一点背景:

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

除了上面的内容,ETW文件"rundown",想到它就像操作系统的状态一样,也会在会话开始和结束时刷新到文件.

尽管事实上大多数消费者认为ETW日志就像普通日志,但它们并非如此.它们与追踪时间密切相关(记住,ETW主要用于Windows内核团队在开始时的性能分析).最近在这方面已经有所改进,因此文件可以独立完全处理,并且可能很适合您的目的.

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

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

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