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

一、Exceptionless极简介绍

640?wx_fmt=png

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

二、Quick Start

2.1 官方创建一个账号

  640?wx_fmt=png

2.2 创建项目

  640?wx_fmt=png

2.3 得到ApiKey

  640?wx_fmt=png

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();        // exceptionlessapp.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 - Loggerservices.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.";}}


  测试结果:

  640?wx_fmt=png

2.8 记录你程序中的各种Exception

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


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


  测试结果:

  640?wx_fmt=png

2.9 Check你的日志与异常记录

  (1)Check 日志

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

  640?wx_fmt=png

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

  640?wx_fmt=png

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

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

  640?wx_fmt=png

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

  640?wx_fmt=png

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

  640?wx_fmt=png

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

  (2)Check 异常

  在Exception菜单下选择Dashboard:

  640?wx_fmt=png

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

  640?wx_fmt=png

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

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

  640?wx_fmt=png

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

  640?wx_fmt=png

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

三、本地部署

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

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

  罗曼缇克,《.Net 开源异常日志ExceptionLess搭建》

  平凡网客,《Exceptionless 本地部署》

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

  以下是测试环境的要求:

  640?wx_fmt=png

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

  640?wx_fmt=png

四、小结

  本篇主要简单的介绍了一下开源的分布式日志框架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大家可以去下载,点我下载)。这些计划可能需要花费我很多时间,不过我相信这样的学习和实践是值得的,也是值得分享的,如果你也有这样的计划,那就一起加油吧!

    640?wx_fmt=png

参考资料

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

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

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

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

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

罗曼缇克,《.Net 开源异常日志ExceptionLess搭建》

平凡网客,《Exceptionless 本地部署》

原文地址:

https://www.cnblogs.com/edisonchou/p/exceptionless_foundation_and_quick_start.html

.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

640?wx_fmt=jpeg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/320984.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

.netcore 整合 log4net

1.背景前两天&#xff0c;曾经的一个同事咨询我&#xff0c;怎样将log4net以中间件的形式整合到core里边去。我不假思索的回答&#xff0c;这种问题应该有人做过吧&#xff0c;他说没有。于是&#xff0c;我去博客园搜了下&#xff0c;发现还真没有&#xff0c;全部都是传统.NE…

Asp.Net Core中利用Seq组件展示结构化日志功能

在一次.Net Core小项目的开发中&#xff0c;掌握的不够深入&#xff0c;对日志记录并没有好好利用&#xff0c;以至于一出现异常问题&#xff0c;都得跑动服务器上查看&#xff0c;那时一度怀疑自己肯定没学好&#xff0c;不然这一块日志不可能需要自己扒服务器日志来查看&…

Apache SkyWalking的架构设计【译文】

Apache SkyWalking提供了一个功能强大并且很轻量级的后端。在此&#xff0c;将介绍为什么采用以下方式来设计它&#xff0c;以及它又是如何工作的。架构图对于APM而言&#xff0c;agent或SDKs仅是如何使用libs的技术细节。手动或自动的形式与架构无关&#xff0c;因此在本文中&…

通俗易懂,什么是.NET?什么是.NET Framework?什么是.NET Core?

什么是.NET&#xff1f;什么是.NET Framework?本文将从上往下&#xff0c;循序渐进的介绍一系列相关.NET的概念&#xff0c;先从类型系统开始讲起&#xff0c;我将通过跨语言操作这个例子来逐渐引入一系列.NET的相关概念&#xff0c;这主要包括&#xff1a;CLS、CTS(CLI)、FCL…

.Net Core小技巧 - Hosted Services + Quartz实现定时任务调度

背景之前一直有朋友问&#xff0c;.Net Core Linux环境有没有类似Windows服务的东西。其实是有的&#xff0c;我了解的方法有两种&#xff1a;#1 创建一个ASP.Net Core的Web项目&#xff08;如Web API&#xff09;&#xff0c;然后通过添加中间件&#xff08;Middleware&#…

在.NET Core微服务中使用HostBuilder和Generic Host

基于控制台的服务中探索一个简单模式&#xff0c;以解决跨领域问题。“通用” Host和HostBuilder是随.NET Core 2.1发布而发布的新功能组件的组件。它们的一个用例是通过提供用于添加横切关注点&#xff08;例如依赖注入&#xff0c;配置和日志记录&#xff09;的模式来简化基于…

EntityFramework Core进行读写分离最佳实践方式,了解一下?

本来打算写ASP.NET Core MVC基础系列内容&#xff0c;博客评论有园友提出讲讲读写分离&#xff0c;这个问题提的好。大多数情况下&#xff0c;对于园友在评论中提出的问题&#xff0c;如果是值得深究或者大多数同行比较关注的问题我都会私下去看看&#xff0c;然后进行对应解答…

小X的加法难题

小X的加法难题 题目大意&#xff1a; 一个AB的式子&#xff0c;但之间有一些没用的空格&#xff0c;要你求出结果 原题&#xff1a; 解题思路&#xff1a; 字符输入&#xff0c;有数字就存起来&#xff0c;用加号和换行符来分开 代码&#xff1a; #include<cstdio>…

【桶排】小 X 的密码破译

小 X 的密码破译 题目大意&#xff1a; 有一堆式子&#xff0c;去重再排序后&#xff0c;按规则求出结果 原题&#xff1a; 解题思路&#xff1a; 把每一个求出来的数丢到桶里&#xff0c;然后跑一遍就可以了 代码&#xff1a; #include<cstdio> using namespace s…

Uva12325 Zombie's Treasure Chest [二分区间+模拟退火]

Zombie’s Treasure Chest 题目链接 https://cn.vjudge.net/problem/UVA-12325 题意 两种物品无穷多个,第一种物品重量s1s_1s1​,价值v1v_1v1​,第二种物品重量s2s_2s2​,价值v2v_2v2​,背包重nnn,求能装的最大价值之和. 数据全都是2e92e92e9.也就是两种物品的完全背包. 题…

Identity Server 4 预备知识 -- OpenID Connect 简介

我之前的文章简单的介绍了OAuth 2.0 (在这里: 要用Identity Server 4 -- OAuth 2.0 超级简介, 还不是很全.这篇文章我要介绍一下 OpenID Connect.OAuth 2.0 不是身份认证协议OAuth 2.0 不是身份认证(Authentication)协议. 为什么有人会认为OAuth 2.0具有身份认证的功能? 这是因…

Ocelot.JwtAuthorize:一个基于网关的Jwt验证包

Ocelot作为基于.net core的API网关&#xff0c;有一个功能是统一验证&#xff0c;它的作用是把没有访问权限的请求挡在API网关外面&#xff0c;而不是到达API网关事端的API时才去验证&#xff1b;之前我有一篇博文Ocelot统一权限验证&#xff0c;作过说明&#xff0c;这篇博文说…

【并查集】小 X 的液体混合

小 X 的液体混合 题目大意&#xff1a; 在一个玻璃瓶里&#xff0c;放入一些液体&#xff0c;某一对液体放在一起会有反应&#xff0c;当某个液体有反应时危险度就会乘2&#xff08;初值为1&#xff09;&#xff0c;问危险度最大是多少 原题&#xff1a; 解题思路&#xff1…

Swagger如何访问Ocelot中带权限验证的API

先亮源代码&#xff1a;https://github.com/axzxs2001/Asp.NetCoreExperiment/tree/master/Asp.NetCoreExperiment/SwaggerDemo这篇博文不是对asp.net core中使用Swagger作介绍&#xff0c;因为社区博客作了详细说明。今天主要说一下Swagger在Ocelot网关权限验证模式下的访问&a…

etcd-workbench一款免费好用的ETCD客户端,支持SSHTunnel、版本对比等功能

介绍 今天推荐一款完全免费的ETCD客户端&#xff0c;可以私有化部署: etcd-workbench 开源地址&#xff1a;https://github.com/tzfun/etcd-workbench Gitee地址&#xff1a;https://gitee.com/tzfun/etcd-workbench 下载 本地运行 从 官方Release 下载最新版的 jar 包&am…

深度学习中反向传播算法简单推导笔记

反向传播算法简单推导笔记 1.全连接神经网络 该结构的前向传播可以写成: z(1)W(1)xb(1)z^{(1)} W^{(1)}xb^{(1)}z(1)W(1)xb(1) a(1)σ(z(1))a^{(1)} \sigma(z^{(1)})a(1)σ(z(1)) z(2)W(2)a(1)b(2)z^{(2)}W^{(2)}a^{(1)}b^{(2)}z(2)W(2)a(1)b(2) a(2)σ(z(2))a^{(2)} \sigm…

EntityFramework Core进行读写分离最佳实践方式,了解一下(二)?

写过上一篇关于EF Core中读写分离最佳实践方式后&#xff0c;虽然在一定程度上改善了问题&#xff0c;但是在评论中有的指出更换到从数据库。那么接下来要进行插入此时又要切换到主数据库&#xff0c;同时有的指出是否可以进行底层无感知操作&#xff0c;这确实是个问题&#x…

一文搞清到底什么是 .NET?

现在各种 .NET 满天飞&#xff0c;别说新手了&#xff0c;连我这样的老手都差点被绕进去。到底什么是 .NET 呢&#xff1f;通俗易懂&#xff0c;什么是.NET?什么是.NET Framework&#xff1f;什么是.NET Core? 这篇文章好长呀&#xff0c;不知道你看完了没有&#xff0c;其实…

Service Mesh新成员:Consul 1.2

本文译自 HashiCorp 官网关于 Consul 1.2 支持 Service Mesh 发布的博客文章。原文链接&#xff1a;https://www.hashicorp.com/blog/consul-1-2-service-mesh作者&#xff1a;Mitchell Hashimoto 翻译&#xff1a;董干 转载自&#xff1a;https://blog.idevfun.io/consul-1-2-…

VAE(变分自编码器)学习笔记

VAE学习笔记 普通的编码器可以将图像这类信息编码成为特征向量. 但通常这些特征向量不具有空间上的连续性. VAE(变分自编码器)可以将图像信息编码成为具有空间连续性的特征向量. 方法是向编码器和解码器中加入统计信息,即特征向量代表的的是一个高斯分布,强迫特征向量服从高…