.Net Core中使用DiagnosticSource进行日志记录

💡 原文中文,约2000字,阅读约需5分钟。
📝

内容提要

System.Diagnostics.DiagnosticSource可以记录程序中的日志,包括不可序列化的类型。它通过订阅发布模式运行,可以根据需要发现和订阅感兴趣的数据源。与ILogger相比,DiagnosticSource主要用于记录强类型诊断事件。要使用DiagnosticSource,需要添加必要的依赖项,并注入DiagnosticSource实例。可以使用Microsoft.Extensions.DiagnosticAdapter包创建使用DiagnosticSource事件的Listener。在Program.cs中启动监听,并可以获取技术分享。

🔎

延伸解读

DiagnosticSource 与 ILogger 的定位差异

文章指出,DiagnosticSource 主要用于强类型诊断,例如记录“Microsoft.AspNetCore.Mvc.ViewNotFound”这类事件;而 ILogger 则用于记录更具体的信息,如“Executing JsonResult, writing value {Value}”。这意味着两者并非替代关系,而是面向不同场景:DiagnosticSource 适合结构化、可订阅的诊断事件,ILogger 适合常规日志输出。开发者应根据是否需要强类型事件和订阅机制来选择。

订阅发布模式带来的灵活性

DiagnosticSource 通过订阅发布模式运行,允许根据需要发现并订阅感兴趣的数据源。这种设计使得诊断信息的产生和消费解耦,生产者只需发出事件,消费者可以按需监听。文章示例中,通过 IsEnabled 检查后再 Write,可以避免不必要的开销。这种模式适合在库或框架中内置诊断点,供外部灵活启用。

使用 DiagnosticAdapter 简化监听器创建

文章推荐使用 Microsoft.Extensions.DiagnosticAdapter 包来创建监听器。通过创建类并用 [DiagnosticName] 属性装饰方法,可以方便地监听特定事件,方法参数会自动匹配事件负载。在 Program.cs 中通过 SubscribeWithAdapter 启动监听。这种方式降低了直接处理 DiagnosticSource 事件的复杂度,但需要添加额外的 NuGet 依赖。

❓

Q&A

DiagnosticSource是什么,它的主要功能是什么?

DiagnosticSource是一个用于记录程序日志的工具,能够记录不可序列化的类型,并通过订阅发布模式发现和订阅数据源。

DiagnosticSource与ILogger有什么区别?

DiagnosticSource主要用于记录强类型诊断事件,而ILogger用于记录更具体的信息。

如何在项目中使用DiagnosticSource?

需要添加必要的NuGet包依赖项,并注入DiagnosticSource实例,然后使用其write方法发出事件。

如何创建DiagnosticSource事件的Listener?

可以创建一个类并使用[DiagnosticName]属性装饰方法,以监听特定事件。

在Program.cs中如何启动DiagnosticSource的监听?

在Program.cs中,获取DiagnosticListener实例并订阅自定义的Listener类以开始接收事件。

DiagnosticSource可以记录哪些类型的事件?

DiagnosticSource可以记录强类型诊断事件,例如'Invoke_WeatherForecast'等。

🏷️

标签

➡️

继续阅读