ASP.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 中。

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实时监控程序运行日志服务

  当然,官方的独立部署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实时监控程序运行日志服务

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

相关实践学习
通过日志服务实现云资源OSS的安全审计
本实验介绍如何通过日志服务实现云资源OSS的安全审计。
目录
相关文章
|
3月前
|
开发框架 .NET C#
ASP.NET Core Blazor 路由配置和导航
大家好,我是码农刚子。本文系统介绍Blazor单页应用的路由机制,涵盖基础配置、路由参数、编程式导航及高级功能。通过@page指令定义路由,支持参数约束、可选参数与通配符捕获,结合NavigationManager实现页面跳转与参数传递,并演示用户管理、产品展示等典型场景,全面掌握Blazor路由从入门到实战的完整方案。
351 6
|
开发框架 .NET 开发者
简化 ASP.NET Core 依赖注入(DI)注册-Scrutor
Scrutor 是一个简化 ASP.NET Core 应用程序中依赖注入(DI)注册过程的开源库,支持自动扫描和注册服务。通过简单的配置,开发者可以轻松地从指定程序集中筛选、注册服务,并设置其生命周期,同时支持服务装饰等高级功能。适用于大型项目,提高代码的可维护性和简洁性。仓库地址:&lt;https://github.com/khellang/Scrutor&gt;
356 5
|
JSON 安全 API
.net 自定义日志类
在.NET中,创建自定义日志类有助于更好地管理日志信息。示例展示了如何创建、配置和使用日志记录功能,包括写入日志文件、设置日志级别、格式化消息等。注意事项涵盖时间戳、日志级别、JSON序列化、线程安全、日志格式、文件处理及示例使用。请根据需求调整代码。
220 13
|
开发框架 .NET C#
在 ASP.NET Core 中创建 gRPC 客户端和服务器
本文介绍了如何使用 gRPC 框架搭建一个简单的“Hello World”示例。首先创建了一个名为 GrpcDemo 的解决方案,其中包含一个 gRPC 服务端项目 GrpcServer 和一个客户端项目 GrpcClient。服务端通过定义 `greeter.proto` 文件中的服务和消息类型,实现了一个简单的问候服务 `GreeterService`。客户端则通过 gRPC 客户端库连接到服务端并调用其 `SayHello` 方法,展示了 gRPC 在 C# 中的基本使用方法。
310 5
在 ASP.NET Core 中创建 gRPC 客户端和服务器
|
开发框架 算法 中间件
ASP.NET Core 中的速率限制中间件
在ASP.NET Core中,速率限制中间件用于控制客户端请求速率,防止服务器过载并提高安全性。通过`AddRateLimiter`注册服务,并配置不同策略如固定窗口、滑动窗口、令牌桶和并发限制。这些策略可在全局、控制器或动作级别应用,支持自定义响应处理。使用中间件`UseRateLimiter`启用限流功能,并可通过属性禁用特定控制器或动作的限流。这有助于有效保护API免受滥用和过载。 欢迎关注我的公众号:Net分享 (239字符)
317 1
|
开发框架 缓存 .NET
GraphQL 与 ASP.NET Core 集成:从入门到精通
本文详细介绍了如何在ASP.NET Core中集成GraphQL,包括安装必要的NuGet包、创建GraphQL Schema、配置GraphQL服务等步骤。同时,文章还探讨了常见问题及其解决方法,如处理复杂查询、错误处理、性能优化和实现认证授权等,旨在帮助开发者构建灵活且高效的API。
379 3
|
5月前
|
存储 负载均衡 NoSQL
【赵渝强老师】Redis Cluster分布式集群
Redis Cluster是Redis的分布式存储解决方案,通过哈希槽(slot)实现数据分片,支持水平扩展,具备高可用性和负载均衡能力,适用于大规模数据场景。
429 2
|
5月前
|
存储 缓存 NoSQL
【📕分布式锁通关指南 12】源码剖析redisson如何利用Redis数据结构实现Semaphore和CountDownLatch
本文解析 Redisson 如何通过 Redis 实现分布式信号量(RSemaphore)与倒数闩(RCountDownLatch),利用 Lua 脚本与原子操作保障分布式环境下的同步控制,帮助开发者更好地理解其原理与应用。
371 6
|
6月前
|
存储 缓存 NoSQL
Redis核心数据结构与分布式锁实现详解
Redis 是高性能键值数据库,支持多种数据结构,如字符串、列表、集合、哈希、有序集合等,广泛用于缓存、消息队列和实时数据处理。本文详解其核心数据结构及分布式锁实现,帮助开发者提升系统性能与并发控制能力。
|
10月前
|
数据采集 存储 数据可视化
分布式爬虫框架Scrapy-Redis实战指南
本文介绍如何使用Scrapy-Redis构建分布式爬虫系统,采集携程平台上热门城市的酒店价格与评价信息。通过代理IP、Cookie和User-Agent设置规避反爬策略,实现高效数据抓取。结合价格动态趋势分析,助力酒店业优化市场策略、提升服务质量。技术架构涵盖Scrapy-Redis核心调度、代理中间件及数据解析存储,提供完整的技术路线图与代码示例。
1069 0
分布式爬虫框架Scrapy-Redis实战指南