【发布时间】:2016-04-10 07:14:41
【问题描述】:
我需要在引导期间记录跟踪事件,因此我配置了一个包含所有必需提供程序的 AutoLogger。但是当我的服务/进程启动时,我想切换到实时模式,这样文件就不会爆炸。 我正在使用TraceEvent,但我不知道如何正确且原子地执行此操作。
我尝试的第一件事:
const int timeToWait = 5000;
using (var tes = new TraceEventSession("TEMPSESSIONNAME", @"c:\temp\TEMPSESSIONNAME.etl") { StopOnDispose = false })
{
tes.EnableProvider(ProviderExtensions.ProviderName<MicrosoftWindowsKernelProcess>());
Thread.Sleep(timeToWait);
}
using (var tes = new TraceEventSession("TEMPSESSIONNAME", TraceEventSessionOptions.Attach))
{
Thread.Sleep(timeToWait);
tes.SetFileName(null);
Thread.Sleep(timeToWait);
Console.WriteLine("Done");
}
在这里,我想让我可以将会话转移到实时模式。但相反,我得到的文件包含 15 秒而不是 10 秒的事件。
如果我改用new TraceEventSession("TEMPSESSIONNAME", @"c:\temp\TEMPSESSIONNAME.etl", TraceEventSessionOptions.Create),也会发生同样的情况。
似乎以下将导致文件停止写入:
using (var tes = new TraceEventSession("TEMPSESSIONNAME"))
{
tes.EnableProvider(ProviderExtensions.ProviderName<MicrosoftWindowsKernelProcess>());
Thread.Sleep(timeToWait);
}
但是在这里我必须重新启用所有提供程序,并根据文档“如果会话已经存在,它将关闭并重新打开(因此孤儿在下次使用时被清理)”。我不明白关于孤儿的最后一部分。显然,在关闭、打开和订阅事件之间的时间可能会发生一些事件。这是否意味着我会失去这些事件,还是会得到后者?
我还在图书馆的文档中找到了以下内容:
在实时模式下,事件被缓冲,并且在事件的触发和会话的接收之间至少有一秒左右的延迟(通常为 3 秒)(以允许事件以多个有效的集群传递事件)
这会使上面的代码正常吗(好吧,除非发生了不可能的事情并且由于某种原因我的线程在创建实时会话和开始处理事件之间延迟了超过一秒)?
我可以关闭会话并创建一个新的不同的会话,但我想我会错过一些事件。或者我可以打开一个新会话,然后关闭基于文件的会话,但我可能会收到重复的事件。
我在网上找不到任何从基于文件的跟踪转移到实时跟踪的示例。
【问题讨论】: