C# ETW日志记录-TraceEventSession覆盖文件

C# ETW日志记录-TraceEventSession覆盖文件,c#,logging,etw,etw-eventsource,C#,Logging,Etw,Etw Eventsource,我有一个IIS应用程序,它使用TraceEventSession捕获ETW消息并将其转发到日志文件:- TraceEventSession _etwSession = new TraceEventSession( "MyEtwLog", @"C:\Logs\MyEtwLog.etl") { 100 }; _etwSession.EnableProvider( TraceEventProviders.GetEventSourceGuidFromName, "MyEtwLog"),

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

TraceEventSession _etwSession = new TraceEventSession(
   "MyEtwLog", @"C:\Logs\MyEtwLog.etl") { 100 };
_etwSession.EnableProvider(
   TraceEventProviders.GetEventSourceGuidFromName, "MyEtwLog"),
   TraceEventLevel.Always);
它工作正常,但由于某些原因,每次我重新启动应用程序时,它都会覆盖日志文件,而不是附加到日志文件中。知道我错过了什么吗


提前谢谢

我不认为你遗漏了什么。无法使用
TraceEventSession
附加到现有文件。使用
TraceEventSession.Merge将不同的文件合并在一起是可能的,但只有当它们来自同一台机器时,才会产生正确的结果,同时也不会重新启动


在ETW API中,如果您想在
TraceEventSession
之外执行此操作,可以附加此选项,但它有局限性。

我认为您没有遗漏任何内容。无法使用
TraceEventSession
附加到现有文件。使用
TraceEventSession.Merge将不同的文件合并在一起是可能的,但只有当它们来自同一台机器时,才会产生正确的结果,同时也不会重新启动


在ETW API中,如果您想在
TraceeEventSession
之外执行此操作,可以附加此选项,但它有局限性。

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

您可以使用附加到ETW文件,TraceEvent目前不支持此功能。我们可能会添加它,但我可以看到公开API会带来更多问题

TL;DR——完整ETW会话及其元数据是登录到每个文件中的内容,每个会话可以有不同的选项,例如时钟分辨率,这可能会导致微妙的时间戳不准确,这可能会在您的雷达范围内,并在某个时刻引起您的不满

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

一点背景:

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

除上述内容外,ETW文件“rundown”也会在会话开始和结束时刷新到文件中,可以将其视为操作系统的状态

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

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

哦,还有一个大的。ETW文件每次从开始到结束顺序读取。也就是说,它会持续增长,你不能从中间阅读,至少不是在支持的方式下:-<
最后,您仍然不想追加,因为假设您编写了一个日志文件foo.etl,然后您购买了一个全新的处理器,并追加到这个日志文件中,您在上一个会话中收集的所有时间戳都将被删除一些

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

您可以使用附加到ETW文件,TraceEvent目前不支持此功能。我们可能会添加它,但我可以看到公开API会带来更多问题

TL;DR——完整ETW会话及其元数据是登录到每个文件中的内容,每个会话可以有不同的选项,例如时钟分辨率,这可能会导致微妙的时间戳不准确,这可能会在您的雷达范围内,并在某个时刻引起您的不满

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

一点背景:

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

除上述内容外,ETW文件“rundown”也会在会话开始和结束时刷新到文件中,可以将其视为操作系统的状态

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

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

哦,还有一个大的。ETW文件每次从开始到结束顺序读取。也就是说,它会持续增长,你不能从中间阅读,至少不是在支持的方式下:-<
最后,您仍然不想追加,因为假设您编写了一个日志文件foo.etl,然后您购买了一个全新的处理器,并追加到这个日志文件中,您在上一个会话中收集的所有时间戳都将被删除一些

你试过TraceEventSessionOptions.Attach吗?我试过这三个选项都没有成功。你试过TraceEventSessionOptions.Attach吗?我试过这三个选项都没有成功。谢谢你提供的信息。你知道除了TraceEven还有什么别的选择吗
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");