• .NET Core微服务之基于Exceptionless实现分布式日志记录


    Tip: 此篇已加入.NET Core微服务基础系列文章索引

    一、Exceptionless极简介绍

      Exceptionless 是一个开源的实时的日志收集框架,它可以应用在基于 ASP.NET,ASP.NET Core,Web API,Web Forms,WPF,Console,ASP.NET MVC 等技术开发的应用程序中,并且提供了REST接口可以应用在 Javascript,Node.js 中。它将日志收集变得简单易用并且不需要了解太多的相关技术细节及配置,对于微服务架构的应用程序来说,统一的日志收集系统的建立更是有必要。

    二、Quick Start

    2.1 官方创建一个账号

      

    2.2 创建项目

      

    2.3 得到ApiKey

      

    2.4 安装Exceptionless.AspNetCore并进行配置

    NuGet>Install-Package Exceptionless.AspNetCore  

      *.目前最新版本是4.3.2004

      在你要进行Logging的项目(MVC,WebAPI等)中注册APIKey,这里以ASP.NET Core WebAPI项目为例:

        public void Configure(IApplicationBuilder app, IHostingEnvironment env, IApplicationLifetime lifetime)
        {
            ......
            app.UseMvc();
            // exceptionless
            app.UseExceptionless(Configuration["Exceptionless:ApiKey"]);
            // swagger
            ......
        }

      这里我将ApiKey配置到了json配置文件中:

      "Exceptionless": {
        "ApiKey": "Your Api Key from Exceptionless server"
      }

    2.5 简单地封装一个ExceptionlessLogger

      (1)自定义一个ILogger接口

        public interface ILogger
        {
            void Trace(string message, params string[] args);
            void Debug(string message, params string[] args);
            void Info(string message, params string[] args);
            void Warn(string message, params string[] args);
            void Error(string message, params string[] args);
        }

      (2)实现ILogger接口:ExceptionlessLogger

        public class ExceptionLessLogger : ILogger
        {
            /// <summary>
            /// Trace
            /// </summary>
            public void Trace(string message, params string[] tags)
            {
                ExceptionlessClient.Default.CreateLog(message, LogLevel.Trace).AddTags(tags).Submit();
            }
    
            /// <summary>
            /// Debug
            /// </summary>
            public void Debug(string message, params string[] tags)
            {
                ExceptionlessClient.Default.CreateLog(message, LogLevel.Debug).AddTags(tags).Submit();
            }
    
            /// <summary>
            /// Info
            /// </summary>
            public void Info(string message, params string[] tags)
            {
                ExceptionlessClient.Default.CreateLog(message, LogLevel.Info).AddTags(tags).Submit();
            }
    
            /// <summary>
            /// Warn
            /// </summary>
            public void Warn(string message, params string[] tags)
            {
                ExceptionlessClient.Default.CreateLog(message, LogLevel.Warn).AddTags(tags).Submit();
            }
    
            /// <summary>
            /// Error
            /// </summary>
            public void Error(string message, params string[] tags)
            {
                ExceptionlessClient.Default.CreateLog(message, LogLevel.Error).AddTags(tags).Submit();
            }
        }

    2.6 注入ExceptionlessLogger

        public IServiceProvider ConfigureServices(IServiceCollection services)
        {
            // IoC - Logger
            services.AddSingleton<ILogger, ExceptionLessLogger>();
            ......
        }

    2.7 在你想要Logging的地方调用

      比如我们要记录一个User登录的日志:

        public class LoginController : Controller
        {
            public ILogger Logger { get; }
    
            public LoginController(ILogger logger)
            {
                Logger = logger;
            }
    
            [HttpGet("{id}")]
            public string Get(int id)
            {
                Logger.Info($"User {id} Login Successfully. Time:{DateTime.Now.ToString()}", "Tag1", "Tag2");
    
                return "Login Success.";
            }
        }

      测试结果:

      

    2.8 记录你程序中的各种Exception

      这里模拟一个空指针的异常,这里借助Exceptionless针对Exception类的扩展方法去进行写异常信息。

        [HttpGet]
        public string Get()
        {
            try
            {
                string str = null;
                str.ToString();
            }
            catch (Exception ex)
            {
                ex.ToExceptionless().Submit();
            }
    
            return "Unknown Error!";
        }

      测试结果:

      

    2.9 Check你的日志与异常记录

      (1)Check 日志

      在Log Messages 或 AllEvents菜单中选择Dashboard,即可看到当前项目所有的Log Message了。(如果选择的是AllEvents,可能还会包含其他类型的信息,比如Exception)

      

      在最近的Log中可以看到我们刚刚的测试中记录的一跳日志:

      

      点击超链接,即可进入详细页面:

      Overview:可以看到一些项目和日志的基本信息,比如Event Type,Level以及标签Tags

      

      Environment:可以看到记录日志所在的项目所处的一些软硬件环境信息

      

      下面是一些额外的信息,比如Framework Version以及Runtime Framework

      

      通过对这些日志的查看和分析,我们可以方便地在一个地方对所有服务中的日志进行查看和分析。But,在线版本对项目和日志数量有限制,建议在生产环境使用本地部署版本,它是开源的。

      (2)Check 异常

      在Exception菜单下选择Dashboard:

      

      在最近的异常信息中找到刚刚记录的:

      

      同样,通过超链接查看详细信息:

      Overview:可以看到这个异常的基本信息,比如Error Type以及Stack Trace,这些都是可以帮准我们快速定位错误的信息

      

      Exception:如果基本信息不够,那就查看详情,你可能需要看看加载了哪些Modules

      

      最后是Environment,跟Log的Environment差不多,这里就不再贴图了。

    三、本地部署

      我们说到Exceptionless是一款强大的开源框架,那么我们可以下载下来根据需要进行独立部署,可以不受一些用户、项目、Event数量的限制。这里我暂时不会去做其独立部署的实践,但是园子里已经有很多的独立部署实践的分享了,有兴趣的朋友可以看看下面几篇:

      依乐祝,《ASP.NET Core免费开源分布式日志收集框架Exceptionless安装配置以及简单实用

      花儿笑弯了腰,《Self Host 使用Exceptionless实时监控程序运行日志服务

      平凡网客,《Exceptionless 本地部署

      当然,官方的独立部署Wiki也是一个绝佳的参考资料:https://github.com/exceptionless/Exceptionless/wiki/Self-Hosting

      以下是测试环境的要求:

      

      以下是Production环境的要求,我们可以看到在Production环境中,强烈推荐使用ELK的ElasticSearch,如果有不知道ELK的朋友也可以百度/Google一下,ELK也是我后续的学习计划。

      

    四、小结

      本篇主要简单的介绍了一下开源的分布式日志框架Exceptionless,并通过两个小例子介绍了如何快速的在ASP.NET Core中进行使用,最后通过在Exceptionless平台中Check我们在程序中记录的日志/异常信息了解Exceptionless的强大。此外,通过引入园友和官方的Wiki文档介绍了Exceptionless的另一种使用模式:本地部署,有兴趣的朋友可以去看看,这里我就不再去实践了(对我现阶段而言,去做独立部署的优先级不高)。本篇没有过多的语言介绍,更多的是贴code以及贴图片,因此不能算是很好的介绍文章,不过结合列出的参考资料应该可以对Exceptionless做个快速入门。

      

      一些朋友问我后续的分享计划,这里小小透漏一下:Ocelot+IdentityServer的结合做统一验证和授权,Ocelot+Butterfly的结合(目前Ocelot已集成Butterfly)做分布式追踪,基于AppMetrics+InfluxDB+Grafana的性能监控,数据一致性(可能会使用几个EventBus框架)初探,基于Apollo做配置中心,ASP.NET Core on Docker与K8S结合等等。等到POC初步研究后,可能还会去看看微软的微服务架构官方高级版大Demo-eShopOnContainers(微软有一本pdf大家可以去下载,点我下载)。这些计划可能需要花费我很多时间,不过我相信这样的学习和实践是值得的,也是值得分享的,如果你也有这样的计划,那就一起加油吧!

      

    参考资料

    Exceptionless Github:https://github.com/exceptionless/Exceptionless

    savorboard(杨晓东),《免费开源分布式系统日志收集框架 Exceptionless

    编程梦,《ExceptionLess新玩法 — 记日志

    编程梦,《ExceptionLess新玩法 -- 审计日志

    花儿笑弯了腰,《Self Host 使用Exceptionless实时监控程序运行日志服务

    平凡网客,《Exceptionless 本地部署

    依乐祝,《ASP.NET Core免费开源分布式日志收集框架Exceptionless安装配置以及简单实用

  • 相关阅读:
    HTML5学习笔记第二节(Email标签(自动验证格式),Number标签,URL标签...)
    Ping检测工具(QQ皮肤实现)
    C#多线程|匿名委托传参数|测试您的网站能承受的压力|附源代码
    PostgreSQL抛错“不良的类型值: long”之解决
    jdbcTemplate.queryForInt()过时替换方法
    Windows Phone 实用开发技巧(27):创建透明Tile
    快乐技术沙龙技术分享之账户助手
    Windows Phone 实用开发技巧(11):让StackPanel中的控件靠右对齐
    Windows Phone 实用开发技巧(19):使用ProgressIndicator做进度显示
    Windows Phone 实用开发技巧(13):自定义Element Binding
  • 原文地址:https://www.cnblogs.com/edisonchou/p/exceptionless_foundation_and_quick_start.html
Copyright © 2020-2023  润新知