设为首页 加入收藏

TOP

Asp.Net Core 轻松学-利用日志监视进行服务遥测(一)
2019-09-17 16:40:33 】 浏览:43
Tags:Asp.Net Core 轻松 利用 日志 监视 进行 服务

前言

????在 Net Core 2.2 中,官方文档表示,对 EventListener 这个日志监视类的内容进行了扩充,同时赋予了跟踪 CoreCLR 事件的权限;通过跟踪 CoreCLR 事件,比如通过跟踪 CoreCLR 事件,可以了解和收集到比如 GC,JIT,ThreadPool,intreop 这些运行时服务的行为;通过使用配置注入,我们将获得一种动态跟踪事件的能力。

1. EventListener 介绍

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

EventListener 位于程序集 System.Diagnostics.Tracing 中,该类提供了一组启用/禁用的方法,按照惯例,先来看一下源代码,了解一下其结构

    public abstract class EventListener : IDisposable
    {
        protected EventListener();

        public event EventHandler<EventSourceCreatedEventArgs> EventSourceCreated;
       
        public event EventHandler<EventWrittenEventArgs> EventWritten;

        protected static int EventSourceIndex(EventSource eventSource);
       
        public void DisableEvents(EventSource eventSource);
       
        public virtual void Dispose();
       
        public void EnableEvents(EventSource eventSource, EventLevel level);
       
        public void EnableEvents(EventSource eventSource, EventLevel level, EventKeywords matchAnyKeyword);
       
        protected internal virtual void OnEventWritten(EventWrittenEventArgs eventData);
    }

从类结构中可以看出,EventListener 中的方法并不多,而且从名字都可以推断出其行为,
因为该类是一个抽象类,并不能直接使用,接下来我们创建一个 ReportListener 类继承它

2. 创建自定义事件侦听器
 public class ReportListener : EventListener
    {
        public ReportListener() { }

        public Dictionary<string, ListenerItem> Items { get; set; } = new Dictionary<string, ListenerItem>();
        public ReportListener(Dictionary<string, ListenerItem> items)
        {
            this.Items = items;
        }

        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");
            }
        }
    }

ReportListener 自定义事件侦听器的代码非常简单,只是简单的继承了 EventListener 后,重写了父类的两个方法:创建事件和写入事件
同时,还定义了一个公共属性 Dictionary<string, ListenerItem> Items ,该属性接受一个 ListenerItem 的跟踪配置集,通过配置文件注入,动态觉得哪些事件可以被写入到侦听器中

3. 配置跟踪项目

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

{
  "listener": [
    {
      "name": "HomeEventSource",
      "level": 5,
      "keywords": -1
    }
  ]
}

配置说明
上面的配置文件表示,定义一个事件源对象(EventSource),名称为 HomeEventSource,事件级别(EventLevel)为 5,关键字(EventKeywords)为 -1
关于事件级别和事件关键字的值,和系统定义的一致

3.1 事件级别定义

namespace System.Diagnostics.Tracing
{
    public enum EventLevel
    {
        LogAlways = 0,
        Critical = 1,
        Error = 2,
        Warning = 3,
        Informational = 4,
        Verbose = 5
    }
}

3.2 事件关键字定义

namespace System.Diagnostics.Tracing
{
    [Flags]
    public enum EventKeywords : long
    {
        All = -1,
        None = 0,
        WdiContext = 562949953421312,
        MicrosoftTelemetry = 562949953421312,
        WdiDiagnostic = 1125899906842624,
        Sqm = 2251799813685248,
        AuditFailure = 4503599627370496,
        CorrelationHint = 4503599627370496,
        AuditSuccess = 9007199254740992,
        EventLogClassic = 36028797018963968
    }
}

3.3 配置文件完全按

首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇telerik:RadGrid 分组自动展开 下一篇.net core i上 K8S(六).netcore程..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目