学习,也是一个总结的过程,对此,我们也许可以总结出来一个比较重要的信息就是:通过 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“回调”关心的事件数据。