设为首页 加入收藏

TOP

Asp.Net Core 轻松学-利用日志监视进行服务遥测(二)
2019-09-17 16:40:33 】 浏览:45
Tags:Asp.Net Core 轻松 利用 日志 监视 进行 服务
照系统值定义,为了更好的使用配置文件,我们定义了下面的实体类

    public class ListenerItem
    {
        public string Name { get; set; }
        public EventLevel Level { get; set; } = EventLevel.Verbose;
        public EventKeywords Keywords { get; set; } = EventKeywords.All;
    }
4. 开始使用事件侦听器

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

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

        public void AddEventListener(IServiceCollection services)
        {
            var listeners = this.Configuration.GetSection("listener").Get<List<ListenerItem>>();
            Dictionary<string, ListenerItem> dict = new Dictionary<string, ListenerItem>();
            if (listeners != null)
            {
                foreach (var item in listeners)
                {
                    dict.Add(item.Name, item);
                }
            }
            var report = new ReportListener(dict);
            services.AddSingleton<ReportListener>(report);
        }

        public void ConfigureServices(IServiceCollection services)
        {
            AddEventListener(services);
            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_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 运行程序,看看输出结果如何

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

5.4 尝试更多事件源

       protected override void OnEventSourceCreated(EventSource eventSource)
        {
            if (eventSource.Name.Equals("Microsoft-Windows-DotNETRuntime"))
            {
                EnableEvents(eventSource, EventLe
首页 上一页 1 2 3 下一页 尾页 2/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇telerik:RadGrid 分组自动展开 下一篇.net core i上 K8S(六).netcore程..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目