gpt4 book ai didi

c# - ETW 日志记录 - TraceEventSession 覆盖文件

转载 作者:太空宇宙 更新时间:2023-11-03 19:07:02 24 4
gpt4 key购买 nike

我有一个 IIS 应用程序,它使用 TraceEventSession 来捕获 ETW 消息并将它们转发到日志文件中:-

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

它工作正常,但出于某种原因,每次我重新启动应用程序时,它都会覆盖日志文件而不是附加到它。知道我错过了什么吗?

提前致谢

最佳答案

免责声明:我在 Microsoft 内部为 TraceEvent 做出贡献

可以使用 EVENT_TRACE_FILE_APPEND_MODE 追加到 ETW 文件,TraceEvent 今天不支持。我们可能会添加它,但我发现暴露 API 的问题比不暴露更多。

TL;DR -- 完整的 ETW session 及其元数据是记录到每个文件中的内容,每个 session 可以有不同的选项,例如时钟分辨率,这可能会导致细微的时间戳不准确,这可能会引起您的注意并导致你在某个时候感到委屈。

这是我的推荐。我已经睡着了,但你会用一些逻辑来决定如何轮换文件(比如在你的 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”(可以将其视为操作系统的状态)也会在 session 开始和结束时刷新到文件中。

尽管事实上大多数消费者认为 ETW 日志就像某种普通日志,但它们有点不同。它们与跟踪的时间密切相关(请记住,ETW 最初主要用于 Windows 内核团队的性能分析)。最近这方面的情况有所改善,因此可以完全独立地处理文件,并且很可能出于您的目的。

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

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

最后你仍然不想追加,因为假设你写了一个日志文件 foo.etl,然后你去买一个全新的处理器并追加到这个日志文件,你在上一个 session 中收集的所有时间戳都会偏离一些数字。

关于c# - ETW 日志记录 - TraceEventSession 覆盖文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25525234/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com