学习, 也是一个总结的过程, 对此, 我们也许可以总结出来一个比较重要的信息就是: 通过 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, 我们接着往下看.
来源: http://www.jianshu.com/p/e0bac2dffbdd