log4net、ETW 和 TraceLogging 的用法区别

Differences between the usage of log4net, ETW & TraceLogging

我已使用 Debug.WriteLine 调试现有遗留应用程序以找到程序流程。现在我正在研究一个基于事件(消息)的应用程序,它包含多个对事件做出反应的服务。它使用许多云(如 Azure)资源。

我正在尝试了解不同的日志系统 ETW(Windows 的事件跟踪)、TraceLogging 和 log4Net 等...其中哪一个支持日志记录系统异常(尤其是来自云服务或资源的异常)、程序异常、编码日志等...

使用 ETW,您还可以捕获内核数据并查看您的代码如何影响 CPU、磁盘使用情况。您还可以捕获 ETW 事件的调用堆栈(Vista 中内核模式事件的调用堆栈以及自 Windows 7 以来的用户模式事件)。

当您使用 ExceptionKeyword 关键字激活日志记录时,.Net 运行时 ETW 提供程序会引发异常。 在 Stack Overflow 上为异常、程序集 (Un)Load 事件激活调用堆栈。在这里您可以看到异常的调用堆栈。

与其他日志记录方法相比,ETW 的优势在于其出色的性能。在您明确激活监听事件并且捕获的 ETL 文件可以传输到其他设备并在那里进行分析之前,日志记录也会被禁用。

ETW 是一个内置于 Windows 中的系统,它接受来自提供者的事件并将事件路由到对它们感兴趣的任何消费者。

提供商使用提供商 GUID、事件级别和事件关键字(类别)标识其事件,并将它们发送到 ETW。如果没有人对该事件感兴趣,ETW 将忽略它。 (关于 ETW 最重要的事情之一是它可以多有效地忽略事件。)

消费者创建一个ETW 侦听会话并告诉ETW 它要记录的事件的GUID、级别和关键字。然后,ETW 收集与请求匹配的所有事件,并将匹配的事件发送给消费者。消费者可以要求 ETW 将事件放入文件中。消费者还可以要求 ETW 在 real-time 中传递事件。消费者还可以要求 ETW 只在内存中保存最近的 N 兆字节的事件,然后根据请求它可以将这些事件保存到磁盘。

因为有数以千计的组件都将事件写入 ETW,所以有可能将来自您的程序的数据与来自其他事件源的信息混合在一起。

ETW 的主要优势在于无需与创建事件的程序交互即可开始使用事件。您只需告诉 ETW“请收集事件 X、Y 和 Z”,ETW 就会计算出如何打开这些事件并将它们发送到您的文件中。但是,这是一个非常强大的功能,因此需要更高的权限。此外,它具有相当大的资源成本,因此我们只想在进行特定调查时收集数据(我们不想总是启动日志)。

特别注意,默认Windows系统一次只能有64个日志收集会话运行。可以通过更改注册表项并重新启动来提高限制,但 Microsoft 希望将其保持在较低水平,以帮助避免让人们因会话占用系统资源而对过多的会话感到抓狂。

TraceLogging 是一种特殊的 ETW。在其他类型的 ETW 中,您必须通过查找 XML 清单或 WPP PDB 文件来弄清楚如何解码事件,并且您必须先编辑 XML 文件以添加新事件你可以生成它。 TraceLogging 更容易,因为您永远不必找到任何东西来解码事件——解码事件所需的信息始终就在 ETL 日志文件中。此外,您无需编辑 XML 文件即可添加新事件——您只需编写代码即可生成事件。

与大多数其他类型的 ETW 一样,TraceLogging 是围绕结构化数据设计的,例如结构的字段。 TraceLogging 事件提供程序有一个名称,每个 TraceLogging 事件都有一个名称,事件中的每个字段都有一个名称和一个类型。因此,您使用您的提供商来记录一个事件,其中包含一个名称,以及多个包含名称和值的字段。

将此与围绕消息字符串设计的其他一些日志记录系统(以及 ETW 的 WPP 风格)进行对比。在这些系统中,您记录一条消息,可能包含插入到消息中的值。这作为一个故事可能更容易阅读,但更难分析。