2014-08-27 86 views
1

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

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

它工作正常,但我每次重新启动时由于某些原因该应用程序会覆盖日志文件而不是附加到它。任何想法我失踪?

在此先感谢

+0

你有没有试过** TraceEventSessionOptions.Attach **? – magicandre1981 2014-08-27 17:38:48

+0

我试过所有三个选项都没有成功。 – 2014-08-28 07:40:40

回答

5

声明:我贡献在微软

内部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 Kernel团队在开始时的性能分析)。最近在这方面情况有所改善,这样文件就可以得到充分的独立处理,并且很可能出于您的目的。

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

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

最后你还是不想追加,因为想象你写一个日志文件foo。etl,那么你去购买一个屁股新的处理器,并追加到这个日志文件中,你在前一个会话中收集的所有时间戳将会被一些数字忽略。

+0

您的建议正是我实施的(在文件名中添加时间戳)。谢谢回复。 – 2014-10-13 10:08:07

0

我不认为你错过了任何东西。无法将TraceEventSession附加到现有文件。将不同的文件与TraceEventSession.Merge合并在一起是可能的,但如果它们来自同一台机器,并且在同一时间内没有重新启动,则只会产生正确的结果。

在ETW API中,如果您想在TraceEventSession之外执行此操作,但有一些限制,可以使用EVENT_TRACE_FILE_MODE_APPEND选项附加方法。

+0

感谢信息拉尔斯。你知道我可以使用TraceEventSession的c#选择吗? – 2014-08-28 07:39:46

+0

对不起,我不知道 – 2014-08-28 10:15:49