.NET中DiagnosticSource如何应用于诊断日志的深度探索?

摘要:1. 引言 最近为了解决ABP集成CAP时无法通过拦截器启用工作单元的问题,从小伙伴那里学了一招。借助DiagnossticSource,可以最小改动完成需求。关于DiagnosticSource晓东大佬18年在文章 在 .NET Core
1. 引言 最近为了解决ABP集成CAP时无法通过拦截器启用工作单元的问题,从小伙伴那里学了一招。借助DiagnossticSource,可以最小改动完成需求。关于DiagnosticSource晓东大佬18年在文章 在 .NET Core 中使用 Diagnostics (Diagnostic Source) 记录跟踪信息就有介绍,文章开头就说明了Diagnostics 一直是一个被大多数开发者忽视的东西。是的,我也忽略了,这个好东西,有必要学习一下,下面就和大家简单聊一聊System.Diagnostics.DiagnosticSource在.NET上的应用。 2. System.Diagnostics.DiagnosticSource Diagnostics位于System命名空间下,由此可见Diagnostics在.NET 运行时中的地位不可小觑。其中System.Diagnostics命名空间下又包含不同类库,提供了允许与系统进程,事件日志和性能计数器进行交互的类。如下图所示: 其中System.Diagnostics.DiagnosticSource模块,它允许对代码进行检测,以在生产时记录丰富的数据负载(可以传递不可序列化的数据类型),以便在进程内进行消耗。消费者可以在运行时动态发现数据源并订阅感兴趣的数据源。 在展开之前,有必要先梳理下涉及的以下核心概念: IObservable:可观测对象 IObserver:观察者 DiagnosticSource :诊断来源 DiagnosticListener:诊断监听器 Activity:活动 3. 观察者模式(IObservable & IObserver) IObservable 和 IObserver位于System命名空间下,是.NET中对观察者模式的抽象。 观察者设计模式使观察者能够从可观察对象订阅并接收通知。它适用于需要基于推送通知的任何方案。此模式定义可观察对象,以及零个、一个或多个观察者。观察者订阅可观察对象,并且每当预定义的条件、事件或状态发生更改时,该可观察对象会通过调用其方法之一来自动通知所有观察者。在此方法调用中,该可观察对象还可向观察者提供当前状态信息。在 .NET Framework 中,通过实现泛型System.IObservable和System.IObserver接口来应用观察者设计模式。 泛型类型参数表示提供通知信息的类型。 第一次学习观察者模式,应该是大学课本中基于事件烧水的例子,咱们就基于此实现个简单的Demo吧。首先执行dotnet new web -n Dotnet.Diagnostic.Demo创建示例项目。 3.1. 定义可观察对象(实现IObservable接口) 对于烧水的示例,主要关注水温的变化,因此先定义Temperature来表示温度变化: public class Temperature { public Temperature(decimal temperature, DateTime date) { Degree = temperature; Date = date; } public decimal Degree { get; } public DateTime Date { get; } } 接下来通过实现IObservable<T>接口来定义可观察对象。 public interface IObservable<out T> { IDisposable Subscribe(IObserver<T> observer); } 从接口申明来看,只定义了一个Subscribe方法,从观察者模式讲,观察者应该既能订阅又能取消订阅消息。为什么没有定义一个UnSubscribe方法呢?其实这里方法申明已经说明,期望通过返回IDisposable对象的Dispose方法来达到这个目的。
阅读全文