手机版

Asp .净核心轻松学之利用日志监视进行服务遥测详解

时间:2021-08-28 来源:互联网 编辑:宝哥软件园 浏览:

前言

在核心2.2净额中,官方文档表示,对事件侦听器这个日志监视类的内容进行了扩充,同时赋予了跟踪运行时事件的权限;通过跟踪运行时事件,比如通过跟踪运行时事件,可以了解和收集到比如气相色谱、准时制、线程池、intreop这些运行时服务的行为;通过使用配置注入,我们将获得一种动态跟踪事件的能力。

1.事件侦听器介绍

1.1事件侦听器中文直译为:事件侦听器

事件侦听器位于程序集系统。诊断。追踪中,该类提供了一组启用/禁用的方法,按照惯例,先来看一下源代码,了解一下其结构

公共抽象类事件侦听器: IDisposable {受保护的事件侦听器();公共事件EventHandlerEventSourceCreatedEventArgs事件源已创建;公共事件EventHandlerEventWrittenEventArgs事件已编写;受保护的静态int事件源索引(事件源事件源);公共无效事件(事件源事件源);公众的虚空dispose();public void EnableEvents(事件源事件源,事件级别);public void EnableEvents(事件源事件源、事件级别、事件关键字匹配关键字);受保护的内部虚拟void one ventwisted(EventWrittenEventArgs事件数据);}从类结构中可以看出,事件侦听器中的方法并不多,而且从名字都可以推断出其行为,因为该类是一个抽象类,并不能直接使用,接下来我们创建一个报表监听器类继承它

2.创建自定义事件侦听器

公共类报表侦听器:事件侦听器{公共报表侦听器()} {公共字典字符串,ListenerItem Items { get设置;}=new Dictionarystring,listener item();公共报告侦听器(字典字符串,ListenerItem项){这个.项目=项目;}受保护的覆盖无效OnEventSourceCreated(事件源事件源){如果(项目).包含密钥(事件源。名称)){ var item=Items[eventSource .名称];EnableEvents(事件源,项目。级别,项目。关键词);} }受保护的覆盖void one ventwisted(EventWrittenEventArgs事件数据){ if(Items .包含密钥(事件数据。事件源。名称)){控制台写入行($ ' ThreadID={事件数据.OSThreadId} ID={eventData .事件Id}名称={事件数据。事件源。名称}。{事件数据.事件名称} ');for(int I=0;我事件数据。有效载荷。计数;I){ string payloadString=事件数据.有效载荷[i]?ToString()?字符串。空的;控制台写入行($ ' \ tName=\ ' {事件数据.PayloadNames[I]} \ ' Value=\ ' { payloadString } \ ' ');}控制台写入行(' \ n ');} } }ReportListener自定义事件侦听器的代码非常简单,只是简单的继承了事件侦听器后,重写了父类的两个方法:创建事件和写入事件

同时,还定义了一个公共属性字典字符串,列表项项目,该属性接受一个ListenerItem的跟踪配置集,通过配置文件注入,动态觉得哪些事件可以被写入到侦听器中

3.配置跟踪项目

在配置文件appsettings.json中增加以下内容

{"侦听器": [ {"名称:“HomeEventSource”级别": 5,"关键字": -1 } ]}配置说明

上面的配置文件表示,定义一个事件源对象(事件源),名称为HomeEventSource,事件级别(事件级别)为5,关键字(事件关键词)为-1

关于事件级别和事件关键字的值,和系统定义的一致

3.1 事件级别定义

系统命名空间。诊断。跟踪{公共枚举事件级别{日志数=0,严重=1,错误=2,警告=3,信息=4,详细=5 }}3.2事件关键字定义

系统命名空间。诊断。跟踪{[标志]公共枚举事件关键字:长{ All=-1,None=0,WdiContext=562949953421312,MicroSoft遥测=562949953421312,wdidiunknowledge=1125899906842624,Sqm=2251799813685248,AuditFailure=4503599627370496配置文件完全按照系统值定义,为了更好的使用配置文件,我们定义了下面的实体类

公共类ListenerItem {公共字符串名称{获取设置;}公共事件级别{获取设置;}=EventLevel .啰嗦;公共事件关键词关键词{获取设置;}=事件关键词.全部;}4.开始使用事件侦听器

为了在应用程序中使用事件侦听器,我们需要初始化事件侦听器,你可以初始化多个事件侦听器;但是,每个事件侦听器仅需要初始化一次即可

4.1 初始化自定义事件侦听器,在Startup.cs文件中加入以下代码

public void AddEventListener(IServiceCollection services){ var listeners=this .配置GetSection('侦听器')。GetListListenerItem();Dictionarystring,侦听器项dict=新的字典字符串,侦听器项();如果(听众!=null) { foreach(侦听器中的定义变量项){ dict .添加(项目。名称、项目);} } var report=新的报表侦听器(dict);服务. AddSingletonReportListener(报表);} public void ConfigureServices(IServiceCollection services){ AddEventListener(services);服务AddMvc().SetCompatibilityVersion(兼容性版本. version _ 2 _ 2);}初始化动作非常简单,仅是从配置文件中读取需要跟踪的项,然后注册到报表监听器内部即可,为了演示事件的注册,我们需要创建一个事件源,就像配置文件中的名称HomeEventSource

4.2 创建自定义的事件源对象

公共类HomeEventSource :事件源{公共静态HomeEventSource实例=新HomeEventSource();[事件(1001)]公共作废请求开始(字符串消息)=WriteEvent(1001,消息);[事件(1002)]公共作废请求停止(字符串消息)=WriteEvent(1002,消息);}自定义事件源HomeEventSource继承自事件源,我们可无需为该自定义事件源进行显式命名,因为默认将会使用HomeEventSource类名进行注册事件

现在,我们尝试着家庭控制器去生产一个事件,看看效果

5.生产事件

5.1 转到家庭控制器,在家庭控制器的得到方法中使用HomeEventSource生产两个事件

[路由(' API/[控制器]')][API控制器]公共类HomeController :控制器库{[HttpGet]public actionresultienumerablesting Get(){ HomeEventSource .实例. RequestStart('处理业务开始');var arra=新字符串[] { 'value1 ',' value 2 ' };家庭事件来源.实例RequestStop(")处理业务结束');返回arra} }5.2回顾一下自定义事件侦听器报表监听器的重写方法

受保护的覆盖无效OnEventSourceCreated(事件源事件源){ if (Items。包含密钥(事件源。名称)){ var item=Items[eventSource。名称];EnableEvents(事件源,项目。级别,项目。关键词);} }受保护的覆盖void oneventwisted(EventWrittenEventArgs event data){ if(Items。包含密钥(事件数据。事件源.名称)){控制台。write line($ ' ThreadID={ event data。OSThreadId} ID={eventData。事件Id}名称={事件数据。事件源.名称}。{eventData。event name } ');for(int I=0;I事件数据。有效载荷。计数;I){ string payloadString=event data。有效载荷[i]?ToString()?字符串。空的;控制台。write line($ ' \ tName=\ ' { event data。PayloadNames[I]} \ ' Value=\ ' { payloadString } \ ' ');}控制台。write line(' \ n ');}}因为我们在配置文件中指定了事件必须是HomeEventSource事件源才能启用事件,所以上面的代码表示当有HomeEventSource事件进入时,事件的内容会打印到控制台。在实际应用中,您可以将这些信息推送给日志订阅者,以便于跟踪和汇总

5.3运行程序,看看输出是什么样的

可见事件制作是成功的。事实上,许多事件都是在CoreCLR内部产生的。我们将尝试启用以下三个事件源,并期望收到大量事件信息。

5.4尝试更多事件源

受保护的覆盖void OnEventSourceCreated(event source)event source { if(event source。name . Equals(' Microsoft-Windows-DotNETRuntime '){ EnableEvents(事件源,事件级别)。详细,事件关键词。audit failure);} else if (eventSource。名称。等于('系统。data . datacommenventsource '){ EnableEvents(event source,EventLevel。详细,事件关键词。audit failure);} else if (eventSource。name . Equals(' Microsoft-AspNetCore-Server-Kestrel '){ EnableEvents(事件源,事件级别)。详细,事件关键词。audit failure);} }5.5再次运行程序,看到下面的输出结果

从图中可以看出,这次我们跟踪了Microsoft-aspnet core-server-kesstrel事件源生产的开始和结束连接事件

结束语

CoreCLR的事件总线包含千千数千个事件源产生的事件。上述实验只是冰山一角。如果将用于创建事件源的EventKeywords指定为All,将会看到大量日志信息。但是,在这里,我们善意地提醒大家,千万不要这样做,这会给业务代码中的服务性能带来很大的损害。不建议编写大量的调试日志,但是使用事件侦听器可以控制事件的创建和写入。当需要监控一个接口时,将需要调试的事件源添加到配置文件中会非常有用。示例代码下载:http://xiaozai.jb51.net/201812/yuanma/ron.listenerdemo _ jb51.rar。

摘要

以上就是本文的全部内容。希望本文的内容对大家的学习或工作有一定的参考价值。有问题可以留言交流。谢谢你的支持。

版权声明:Asp .净核心轻松学之利用日志监视进行服务遥测详解是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。