2

我正在使用 EventSource 登录 ETW。我们正在使用 .Net Framework 4.5。

由于我还处于开发初期,我将在我的 EventSource 子类中频繁更改方法签名。我真的不想每次进行更改时都增加版本。版本只是一个字节,所以我很快就会用完版本。

有没有一种方法可以强制 ETW 在不添加/更改版本属性的情况下识别签名更改?

感觉它可能与清单文件的生成有关,但我真的找不到很多关于如何在 v4.5 中完成的信息。过去似乎需要手动生成清单文件,现在它以某种方式神奇地生成了。

对此的任何帮助将不胜感激。

编辑:

当我更改签名时,日志看起来仍然像旧签名。例如,如果我的方法看起来像这样

public void MyLogMethod(string name, int id)

稍后,如果我想添加另一个参数,例如

public void MyLogMethod(string name, int id, string message)

除非我增加 Version 属性,否则消息值不会显示在有效负载中。我希望 ETW 能够识别我更改的签名,而无需更改 Version 属性。

4

1 回答 1

2

ETW 是一个强类型日志系统,EventSource 是建立在它之上的 .NET 层。是的,现在 EventSource 正在自动将其自己的清单注入 ETW 流。但是您必须使用通过 Nuget 源分发的最新稳定版本。作为 .NET 4.5 一部分的版本几乎没有错误并且缺少某些功能。

最新版本的 EventSource 在启动期间和每次将要创建新的 ETL 文件时将清单信息发送到底层 ETW 提供程序。如果您使用的是Tx LINQpad 驱动程序SfvPerf,您可以看到记录的 ETL 文件中的第一个事件的事件 id 等于 64567(据我记得)这是一个 EventSource 系统事件,它也使用相同的id 来记录其错误消息,因此您可以检查这些错误消息以用于诊断目的。

Version 属性的唯一目的是支持当您有多个客户端使用不同版本来提供相同 ETW 提供程序时的场景,因此结果跟踪事件可能会根据版本标记进行反序列化。在您的情况下,为您的事件源保留早期版本的 ETW 清单之间的兼容性似乎不是问题。

于 2015-04-10T20:32:23.850 回答