1

我们使用 实现结构化日志记录System.Diagnostics.Tracing.EventSource,并在收集跟踪时使用内联提供程序清单,以避免使用 EventRegister 和 wevtutil 的安装问题。我们将 EventSource 设计为以足够低的容量进行连续、持久的日志记录。我正在努力使用 Microsoft 提供的一系列 ETW 控制器来实现收集。我想定义一个 ETW 会话:

  • 为我的 ETL 文件设置最大文件大小
  • 当 ETL 文件达到最大大小时,滚动到具有递增版本/时间戳信息的新文件。我想要覆盖旧事件的循环日志。我们将自行管理存档。
  • 在每个新文件中从事件流的开头维护清单数据 - 请记住,我们使用的是内联提供程序清单。

我使用以下 logman 命令关闭了(指定的提供程序 guid 来自自定义事件源):

logman start "Session" -p "{55a51afc-22e0-5581-6db2-01d5bbe42500}" -mode newfile -max 1 -o .\test%d.etl -ets

在 Perfview 中查看,生成的第一个 ETL 文件看起来很棒:

良好的 ETL 文件

每个后续文件如下所示,大概是因为清单数据丢失了:

错误的 ETL 文件

我可以向 logman 提供一个选项来满足我的第三个要求吗?Vance Morrison在他的博客中暗示ETW 支持 CaptureState 命令来重新发送清单数据:

循环缓冲区情况的解决方案是要求 EventSource 在跟踪结束时再次转储其清单(它肯定会在窗口中)。这只是需要的一堆“破败”的一个例子。ETW 通过“CaptureState”命令支持这一点。

如果 logman 无法做到这一点,那么其他 ETW 控制器之一能否满足我的所有要求?我对 perfview、windows 性能记录器、xperf、tracelog 或任何其他我错过的东西持开放态度。

4

0 回答 0