从你的问题
...我希望在我正在编写的大型复合应用程序中使用它...
我可以推断出大是指在单个开发人员的上下文中。在这种情况下,您可以从 EventSource 派生并将您可能想要的所有事件添加到该类中。为复合应用程序的每个部分创建一个额外的 EventSource 派生类没有多大意义,因为它会污染已经注册了 2K 提供程序的事件源注册数据库。除此之外,如果您需要记住 20 个您需要启用的 guid,以便通过多个层遵循您的应用程序逻辑,则很难为您的应用程序启用日志记录。
一个折衷方案是在您的 EventSource 类中定义一些通用事件,例如
public void WriteViolation(string Subsystem, string Message, string Context)
您在组件中的每个组件都有一个记录器类
public static class NetworkLogger
{
public static void Violation(string message)
{
GenericSource.Instance.Violation("Network", message, NetworkContext.Current);
}
}
public static class DatabaseLogger
{
public static void Violation(string message)
{
GenericSource.Instance.Violation("Database", message, DBContext.Current);
}
}
这样,您可以保持记录器组件的特定性,并且可以在必要时自动将上下文信息添加到通用事件中。另一种方法是在您的应用程序跟踪中使用您的跟踪方法进入/离开、信息、警告、错误,而您的 EventSource 派生类只知道这些事件。当您为每个跟踪条目添加类型名称 + 方法名称时,您可以在 WPA 中按命名空间和按类进行过滤,以查看您在做什么。.NET 4.0 的语义跟踪中显示了一个示例。对于大型应用程序,您可以在您的机器上签出文件
C:\Windows\Microsoft.NET\Framework\v4.0.30319\CLR-ETW.man
您可以使用 Windows SDK 中的 ecmangen.exe 打开它,以获得一个不错的 GUI 来查看事件的结构。.NET 只定义了两个事件提供程序。许多事件通过关键字分组,以启用 .NET 的特定方面,例如 GC、Loader、Exceptions,...。这很重要,因为您可以在启用提供程序特定关键字时传递给它以仅启用大型提供程序的某些事件.
您还可以查看 Microsoft.Windows.ApplicationServer.Applications.45.man 以了解 Workflow 人员如何看待 ETW 事件。这应该有助于找到自己的方式。与您如何准确地构建事件无关,因为真正的测试是在客户站点发现生产错误。您很有可能需要进行多次迭代,直到找到正确的平衡点来记录/跟踪有助于诊断现场故障的相关信息。