我有一个IIS应用程序,它使用TraceEventSession捕获ETW消息并将它们转发到日志文件中: -
TraceEventSession _etwSession = new TraceEventSession(
"MyEtwLog", @"C:\Logs\MyEtwLog.etl") { 100 };
_etwSession.EnableProvider(
TraceEventProviders.GetEventSourceGuidFromName, "MyEtwLog"),
TraceEventLevel.Always);
它工作正常,但出于某种原因,每次重新启动应用程序时,它都会覆盖日志文件而不是附加到它。知道我错过了什么吗?
提前致谢
答案 0 :(得分:5)
免责声明:我在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,那么你去购买一个打屁股的新处理器然后你附加到这个日志文件,你在以前收集的所有时间戳会话将被一些数字关闭。
答案 1 :(得分:0)
我认为你没有遗漏任何东西。无法使用TraceEventSession
附加到现有文件。将不同的文件与TraceEventSession.Merge
合并是可能的,但如果它们来自同一台机器,并且同时没有重新启动,则只会产生正确的结果。
在ETW API中,如果您想在TraceEventSession
之外执行,可以使用EVENT_TRACE_FILE_MODE_APPEND选项进行追加,但它有局限性。