在 .NET Core 中使用 DiagnosticSource 记录跟踪信息(2)

学习,也是一个总结的过程,对此,我们也许可以总结出来一个比较重要的信息就是:通过 Diagnostics 的命名空间变化,由 Microsoft 变为了 System, 我们可以看到 Diagnostics 对于我们的应用程序来说变得更加重要了。

由于 EventSource 只支持 Windows,所以在全新的 .NET Core 中,它已经被悄悄的取代了,下面我们来看一下全新的 DiagnosticSource。

在 .NET Core 中 .NET 团队设计了一个全新的 DiagnosticSource,新的 DiagnosticSource 非常的简单,它允许你在生产环境记录丰富的 payload 数据,然后你可以在另外一个消费者可以消费感兴趣的记录,是不是听着有点懵逼?没关系,等会我再详细说。

我们先来说说 DiagnosticSource 和上面的 EventSource 的区别,他们的架构设计有点类似,主要区别是 EventSource 它记录的数据是可序列化的数据,会被在进程外消费,所以要求记录的对象必须是可以被序列化的。而 DiagnosticSource 被设计为在进程内处理数据,所以通过它可以拿到更加丰富的一些数据信息,它支持非序列化的对象,比如 HttpContext , HttpResponseMessage 等。如果你想在 EventSource 中获取 DiagnosticSource 中的事件数据,你可以通过 DiagnosticSourceEventSource 这个对象来进行数据桥接。

下面我们来看一下在代码中如何使用 DiagnosticSource对象。

在这之前我们需要了解另外一个对象 DiagnosticListener,DiagnosticListener 从命名上来看它是一个监听诊断信息的对象,它确实是一个用来接收事件的类,在 .NET Core 中 DiagnosticSource 它其实是一个抽象类,定义了记录事件日志所需要的方法,那么我们在使用的时候就需要使用具体的对象,DiagnosticListener 就是 DiagnosticSource 的默认实现,明白了吧。

好了,现在我们来看一下如何使用吧。

生成 Diagnostic 日志记录

如何生成 Diagnostic 日志记录呢?首先,我们需要创建一个 DiagnosticListener 对象,比如:

privatestaticDiagnosticSource httpLogger =newDiagnosticListener("System.Net.Http");

DiagnosticListener 参数中的名称即为需要监听的事件(组件)名称,这个名称在以后会被用来被它的消费者所订阅使用。

DiagnosticSource 其核心只包含了两个方法,分别是 :

boolIsEnabled(stringname)voidWrite(stringname,objectvalue);

那么然后我们可以这样来调用:

if(httpLogger.IsEnabled("RequestStart")){    httpLogger.Write("RequestStart",new{ Url="http://clr", Request=aRequest });}

IsEnabled(string param1) 这个方法用来判断是否有消费者注册了当前的事件(组件)名称监听,通常有消费者关心了相关数据,我们才会进行事件记录。

Write(string param1,object param2) 这个方法用来向 DiagnosticSource 中写入日志记录,param1 和上面一样用来指定名称的,也就是所向指定名称中写入数据,param2 即为写入的 payloads 数据,你可以使用 匿名类型来向 param2 中写入数据,这样会方便很多。

这样,我们就已经把 Diagnostic 事件日志写入到 DiagnosticSource中了,是不是很简单? 我们再看一下如何进行消费(监听)这些事件信息。

监听 Diagnostic 日志记录

在监听 Diagnostic 日志记录之前你需要知道你要关心的事件数据名称,那么如果仅仅是在代码中把 DiagnosticListeners 都写死到监听的消费者代码中的话,这样就太不灵活了,所以这里设计了一个机制用来发现中那些在运行时被激活的DiagnosticListeners。

你可以使用 DiagnosticListener.AllListeners 来获取一个 IObservable对象,IObservable接口大家应该都不陌生了吧,然后通过其Subscribe方法进行OnNext“回调”关心的事件数据。


通过这种方式,我们就可以在触发回调的之后做一些我们想要的操作了。是不是发现上面的那种写法有点麻烦和丑陋,ASP.NET 团队考虑到了,所以为我们封装了一个适配器的库来方便我们进行监听的一些操作,你可以通过打 attribute 标记的方式来进行相关事件的订阅,有兴趣的同学可以看下这个(Microsoft.Extensions.DiagnosticAdapte) NuGet 包。现在我们已经可以拿到数据了,有同学可能会说在生产环境数据这么多,这些数据我存到哪里,又怎么样来处理呢,我不可能一条一条的来找性能在哪里吧,OK,我们接着往下看。

你可能感兴趣的:(在 .NET Core 中使用 DiagnosticSource 记录跟踪信息(2))