Asp.Net Core轻松学之利用日志监视进行服务遥测详(2)

初始化动作非常简单,仅是从配置文件中读取需要跟踪的项,然后注册到 ReportListener 内部即可,为了演示事件的注册,我们需要创建一个事件源,就像配置文件中的名称 HomeEventSource

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

public class HomeEventSource : EventSource { public static HomeEventSource Instance = new HomeEventSource(); [Event(1001)] public void RequestStart(string message) => WriteEvent(1001, message); [Event(1002)] public void RequestStop(string message) => WriteEvent(1002, message); }

自定义事件源 HomeEventSource 继承自 EventSource,我们可无需为该自定义事件源进行显式命名,因为默认将会使用 HomeEventSource 类名进行注册事件

现在,我们尝试着 HomeController 去生产一个事件,看看效果

5. 生产事件

5.1 转到 HomeController,在 HomeController 的 Get 方法中使用 HomeEventSource 生产两个事件

[Route("api/[controller]")] [ApiController] public class HomeController : ControllerBase { [HttpGet] public ActionResult<IEnumerable<string>> Get() { HomeEventSource.Instance.RequestStart("处理业务开始"); var arra = new string[] { "value1", "value2" }; HomeEventSource.Instance.RequestStop("处理业务结束"); return arra; } }

5.2 回顾一下自定义事件侦听器 ReportListener 的重写方法

protected override void OnEventSourceCreated(EventSource eventSource) { if (Items.ContainsKey(eventSource.Name)) { var item = Items[eventSource.Name]; EnableEvents(eventSource, item.Level, item.Keywords); } } protected override void OnEventWritten(EventWrittenEventArgs eventData) { if (Items.ContainsKey(eventData.EventSource.Name)) { Console.WriteLine($"ThreadID = {eventData.OSThreadId} ID = {eventData.EventId} Name = {eventData.EventSource.Name}.{eventData.EventName}"); for (int i = 0; i < eventData.Payload.Count; i++) { string payloadString = eventData.Payload[i]?.ToString() ?? string.Empty; Console.WriteLine($"\tName = \"{eventData.PayloadNames[i]}\" Value = \"{payloadString}\""); } Console.WriteLine("\n"); } }

由于我们做配置文件中指定了必须是 HomeEventSource 事件源才启用事件,所以上面的代码表示,当一个 HomeEventSource 事件进入的时候,将事件的内容打印到控制台,实际应用中,你可以将这些信息推送到日志订阅服务器,以方便跟踪和汇总

5.3 运行程序,看看输出结果如何

Asp.Net Core轻松学之利用日志监视进行服务遥测详

可以看到,事件生产成功,实际上,CoreCLR 内部生产了非常多的事件,下面我们尝试启用以下 3 个事件源,预期将会收到大量的事件信息

5.4 尝试更多事件源

protected override void OnEventSourceCreated(EventSource eventSource) { if (eventSource.Name.Equals("Microsoft-Windows-DotNETRuntime")) { EnableEvents(eventSource, EventLevel.Verbose, EventKeywords.AuditFailure); } else if (eventSource.Name.Equals("System.Data.DataCommonEventSource")) { EnableEvents(eventSource, EventLevel.Verbose, EventKeywords.AuditFailure); } else if (eventSource.Name.Equals("Microsoft-AspNetCore-Server-Kestrel")) { EnableEvents(eventSource, EventLevel.Verbose, EventKeywords.AuditFailure); } }

5.5 再次运行程序,看下图输出结果

Asp.Net Core轻松学之利用日志监视进行服务遥测详

从图中可以看出,这次我们跟踪到了 Microsoft-AspNetCore-Server-Kestrel 事件源生产的开始和结束连接事件

结束语

在 CoreCLR 的事件总线中,包含了千千万万的事件源生产的事件,以上的实验只是冰山一角,如果你把创建事件源的 EventKeywords 指定为 All,你将会看到天量的日志信息,但是,在这里,友情提示大家,千万不要这样做,这种做法会对服务性能带来极大损害

在业务代码中,写入大量的调试日志是不可取的,但是使用事件侦听器,可以控制事件的创建和写入,当需要对某个接口进行监控的时候,通过将需要调试的事件源加入配置文件中进行监控,这将非常有用

示例代码下载:

总结

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wdsdfz.html