基于诊断源的日志框架与它们有本质的不同。它的设计思想是,DiagnosticSource作为发布者,在同一个过程中直接将原始日志加载对象分发给订阅者,后者决定如何处理日志内容。

01

标准观察者模式

日志框架作为一个典型的应用应该被看作是观察者模式。上述所有基于TraceSource和EventSource的日志框架都采用这种模式,基于DiagnosticSource的诊断日志框架也不例外。

可以说,观察者模式在基于DiagnosticSource的诊断日志框架中的应用更加规范,因为作为日志事件的发布者和订阅者类型,有必要明确实现iobservable

观察者模式反映的是观察者提前向被观察者注册某个话题的订阅,被观察者在发送话题时会选择匹配的观察者来实现定点发送。上面提到的两个接口是可以观察的

如下面的代码片段所示

公共接口可观察<。outT>。

{

IDisposable Subscribe;

}

publicinterfaceIObserver<。inT>。

{

voidOnCompleted;

作废;

voidOnNext;

}

基于诊断源的诊断日志框架的发布者是一个名为诊断侦听器的类型。虽然就命名而言,它更像是一个订阅者,但它确实是一个实现iobservable的发布者

publicatabstractclassdiagnosticsource

{

protected DegnosticSource;

publicatabstractboolisenabled;

publicatvirtualboollisenabled;

publicatabstractvoitwrite;

公共活动开始活动;

publicativostopactivity;

}

如上面的代码片段所示,DiagnosticListener提供了一个Write方法来发送诊断日志事件,该方法的两个参数分别表示日志事件的名称和内容加载。两个IsEnabled方法用于确定具有指定名称和相应参数的诊断侦听器是否已启用。在发送日志事件之前,通过这两种方法确认有效性是绝对必要的,甚至是必要的。至于另外两种方法,StartActivity和StopActivity,都是针对跟踪活动的,我们将在下面的内容中分别介绍。

以下是诊断侦听器的定义。DiagnosticListener实现iobservable

公共类诊断侦听器:诊断源,

IObservable<。KeyValuePair<。字符串,对象>;>。,IDisposable

{

publicstringName { get}

publicDiagnosticlistener;

public boolisenabled;

public override Boolisenabled;

public override Boolisenabled;

publicIDisposable Subscribe;

公共虚拟一次性订阅服务器& ltKeyValuePair<。字符串,对象>;>。观察者,谓词& ltstring>。isEnabled);

public override void write;

public virtual void dispose;

}

作为一个出版商,它体现为一个可遵守的

当调用Subscription方法来注册订户时,我们还可以指定一个附加的筛选条件。如果一个预言

诊断侦听器有三个IsEnabled方法重载来确定当前是否有指定类型的订阅者。如果有任何订阅服务器,不带参数的IsEnabled方法将返回真。至于另外两个方法重载,这对应于具有指定筛选条件的两个订阅方法重载。前者将使用注册期间指定的过滤条件来确定它是否是匹配的订户。

作为诊断日志事件的发布者,它们在逻辑上是相互独立的,尽管它们使用进程内通信。如果要订阅诊断日志事件,必须首先找到并获取作为事件发布者的诊断侦听器对象。为了解决这个问题,诊断侦听器定义了以下所有侦听器来存储当前进程创建的所有诊断侦听器对象。

publicclassDiagnosticListener:

诊断源,

IObservable<。KeyValuePair<。字符串,对象>;>。,IDisposable

{

publicstatic IObservable<。诊断监听器>AllListeners { get}

...

}

代码中所有诊断侦听器集的“所有侦听器”属性在外部表示为一个可观察的

当我们调用订阅方法时,一个

02

匿名用户服务器

无论是表示诊断日志事件发布者的诊断侦听器,还是表示类型中所有诊断侦听器的静态属性“所有侦听器”,它们都体现为一个可观察的

public abstract class observerbase & lt;T>。:IObserver & ltT>。,IDisposable

{

publicvoidOnNext;

protectedabstract空隙连接核心;

publicationcompleted;

protectedabstract空隙completed core;

publicvoid;

protectedabstract空隙核心;

public void dispose;

protected virtualvoid dispose;

}

public sealed class anonymousbserver & lt。T>。:ObserverBase<。T>。

{

publicAnonymousObserver;

publicAnonymousObserver;

publicAnonymousObserver;

publicAnonymousObserver;

protected override void onnextcore;

protected override voice completed Core;

protectedoverride voidCore;

}

匿名用户服务器<。T>。在NuGet包“系统”中定义。反应堆堆芯”,它采用了

publicationstaticlasobservebextensions

{

publicstaticIDisposable订阅& ltT>。;

publicstaticIDisposable订阅& ltT>。;

publicstaticIDisposable订阅& ltT>。;

publicstaticIDisposable订阅& ltT>。;

publicstaticIDisposable订阅& ltT>。;

publicationstaticvotysubscribe & lt。T>。;

publicationstaticvotysubscribe & lt。T>。;

publicationstaticvotysubscribe & lt。T>。;

publicationstaticvotysubscribe & lt。T>。;

publicationstaticvotysubscribe & lt。T>。;

}

调用这些方法将使日志事件的订阅注册变得非常简单。接下来,我们将演示一个简单的例子。下面的代码片段反映了用于HTTP请求处理的网络服务器的日志输出。服务器收到请求后,以日志的形式输出请求上下文信息和当前时间戳,成功发送响应后,输出响应消息和整个请求处理的时间消耗。

publicclassProgram

{

publicationstativonmain

{

诊断侦听器。所有侦听器。订阅

{

听众。订阅

{

dynamicpayload = eventData。价值;

varrequest = ;

vartimestamp = 有效负载。时间戳;

控制台。写线

{

dynamicpayload = eventData。价值;

var response =;

varelaped = 有效负载。Elaped

控制台。写线;

}

});

var source = NewDiagnosticlistener;

秒表=秒表。start NEw;

if)

{

var request = new Httprequestmessage;

来源。写});

}

任务。延迟。wait;

if)

{

var response = new HttpResponsemessage;

来源。写;

}

}

}

我们先来看看诊断日志的问题。首先,我们创建一个名为“网络”的诊断侦听器对象,并使用打开的秒表来计算请求处理时间。我们使用手动创建的HttpRequestMessage对象来模拟接收到的请求。当调用写方法来发送名为“接收请求”的日志事件时,HttpRequestMessage对象和当前时间戳被用作匿名对象,作为日志的内容加载对象。

在人工等待100毫秒来模拟请求的处理时间后,我们调用诊断侦听器的写方法来发送一个名为“发送回复”的日志事件,以标记当前请求的处理已经结束。作为内容加载的匿名对象,它包含一个由我们手动创建的HttpResponseMessage和模拟时间。

在程序的前半部分,对日志事件的订阅是通过调用扩展方法Subscribe来实现的,当指定的操作

对于订阅的“ReceiveRequest”事件,我们使用一个动态类型来表示HttpRequestMessage对象和当前请求的当前时间戳,并打印出请求的URL和当前时间戳。对于“发送回复”事件,我们使用相同的方法提取代表响应消息的HttpResponseMessage对象和时间消耗,并打印出响应状态代码和时间消耗。程序运行后,我们将在控制台上看到如图1所示的输出。

图1事件列表器对有效载荷的分析

1.《diagnostic .NET Core的诊断日志[9]:针对DiagnosticSource的诊断日志[上篇]》援引自互联网,旨在传递更多网络信息知识,仅代表作者本人观点,与本网站无关,侵删请联系页脚下方联系方式。

2.《diagnostic .NET Core的诊断日志[9]:针对DiagnosticSource的诊断日志[上篇]》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。

3.文章转载时请保留本站内容来源地址,https://www.lu-xu.com/keji/1696163.html