如何使用C#EventSource和ETW实现连续记录?

时间:2019-06-16 15:14:08

标签: etw etw-eventsource perfview logman

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

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

我使用以下logman命令关闭了(指定的提供者guid来自自定义EventSource):

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

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

Good ETL File

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

Bad ETL File

我可以提供给Logman以满足我的第3个要求的选项吗?万斯·莫里森(hinted on his blog)表示ETW支持CaptureState命令来重新发送清单数据:

  

循环缓冲区情况的解决方案是要求EventSource在跟踪的末尾(肯定会在窗口中)再次转储其清单。这只是一堆需要的“减少”的例子。 ETW通过“ CaptureState”命令支持此功能。

如果logman无法做到这一点,那么其他ETW控制器之一是否可以满足我的所有要求?我愿意接受perfview,Windows性能记录器,xperf,tracelog或其他任何我想念的东西。

0 个答案:

没有答案