【问题标题】:Moving from file-based tracing session to real time session从基于文件的跟踪会话转移到实时会话
【发布时间】: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 秒)(以允许事件以多个有效的集群传递事件)

这会使上面的代码正常吗(好吧,除非发生了不可能的事情并且由于某种原因我的线程在创建实时会话和开始处理事件之间延迟了超过一秒)?

我可以关闭会话并创建一个新的不同的会话,但我想我会错过一些事件。或者我可以打开一个新会话,然后关闭基于文件的会话,但我可能会收到重复的事件。

我在网上找不到任何从基于文件的跟踪转移到实时跟踪的示例。

【问题讨论】:

    标签: trace etw


    【解决方案1】:

    我设法联系了 TraceEvent 的作者,这是我得到的答案:

    除了“自动关闭和重启”功能之外,它确实是关于操作系统的问题(TraceEvent 只是调用底层的操作系统 API)。仅供参考,关于孤儿的交易是您的进程很容易退出但让会话继续进行。这可能是您想要的,但通常不是,因此如果您执行Create(这是默认设置),那么为了使常见情况“正常工作”,如果会话已经存在(因为您问过),它将关闭会话换一个新的)。

    实验当然是“真理”的试金石,但坦率地说,我认为不寻常的组合能够正常工作通常是不正确的。

    我的建议是保持简单。您需要打开一个新会话并关闭原始会话。是的,您最终会得到重复项,但您可以将它们过滤掉(毕竟它们是相同的时间戳)。

    另一种可能性是以预期的方式使用SetFileName(从一个文件到另一个文件)。这当然可以解决您的文件大小增长问题,并且通常是处理其他情况的好方法(毕竟您可以开始处理并开始删除文件,即使正在生成新文件)。

    【讨论】:

      猜你喜欢
      • 2012-01-05
      • 2013-06-27
      • 2018-02-05
      • 1970-01-01
      • 1970-01-01
      • 2011-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多