.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安装配置以及简单实用》
.NET Core微服务之基于Exceptionless实现分布式日志记录的更多相关文章
- .NET Core微服务之基于Ocelot实现API网关服务
Tip: 此篇已加入.NET Core微服务基础系列文章索引 一.啥是API网关? API 网关一般放到微服务的最前端,并且要让API 网关变成由应用所发起的每个请求的入口.这样就可以明显的简化客户端 ...
- .NET Core微服务之基于Ocelot实现API网关服务(续)
Tip: 此篇已加入.NET Core微服务基础系列文章索引 一.负载均衡与请求缓存 1.1 负载均衡 为了验证负载均衡,这里我们配置了两个Consul Client节点,其中ClientServic ...
- .NET Core微服务之基于Consul实现服务治理
Tip: 此篇已加入.NET Core微服务基础系列文章索引 一.Consul基础介绍 Consul是HashiCorp公司推出的开源工具,用于实现分布式系统的服务发现与配置.与其他分布式服务注册与发 ...
- .NET Core微服务之基于Consul实现服务治理(续)
Tip: 此篇已加入.NET Core微服务基础系列文章索引 上一篇发布之后,很多人点赞和评论,不胜惶恐,这一篇把上一篇没有弄到的东西补一下,也算是给各位前来询问的朋友的一些回复吧. 一.Consul ...
- .NET Core微服务之基于IdentityServer建立授权与验证服务
Tip: 此篇已加入.NET Core微服务基础系列文章索引 一.IdentityServer的预备知识 要学习IdentityServer,事先得了解一下基于Token的验证体系,这是一个庞大的主题 ...
- .NET Core微服务之基于IdentityServer建立授权与验证服务(续)
Tip: 此篇已加入.NET Core微服务基础系列文章索引 上一篇我们基于IdentityServer4建立了一个AuthorizationServer,并且继承了QuickStartUI,能够成功 ...
- .NET Core微服务之基于Ocelot+IdentityServer实现统一验证与授权
Tip: 此篇已加入.NET Core微服务基础系列文章索引 一.案例结构总览 这里,假设我们有两个客户端(一个Web网站,一个移动App),他们要使用系统,需要通过API网关(这里API网关始终作为 ...
- .NET Core微服务之基于EasyNetQ使用RabbitMQ消息队列
Tip: 此篇已加入.NET Core微服务基础系列文章索引 一.消息队列与RabbitMQ 1.1 消息队列 “消息”是在两台计算机间传送的数据单位.消息可以非常简单,例如只包含文本字符串:也可以更 ...
- .NET Core微服务之基于MassTransit实现数据最终一致性(Part 1)
Tip: 此篇已加入.NET Core微服务基础系列文章索引 一.预备知识:数据一致性 关于数据一致性的文章,园子里已经有很多了,如果你还不了解,那么可以通过以下的几篇文章去快速地了解了解,有个感性认 ...
随机推荐
- canvas绘制形状
栅格 之前简单模板中有个宽/高150px的canvas元素.如下图所示,canvas元素默认被网格所覆盖.通常来说网格中的一个单元相当于canvas元素中的一像素.栅格的起点为左上角(坐标为(0,0) ...
- 嘿嘿嘿,开始自学mysql
开始学习mysql了,作为非计算机专业学生,必须需要一个地方来给自己的知识进行一些记录和总结. 一SQL语句 数据库是不认识java语言的,但是我们同样要与数据库交互,这时需要使用到数据库认识的语言S ...
- Python Django 2.2登录功能_2
#Now 让我们继续对上篇的登录进行操作 #对于csrf,以后再开篇章记录 #修改index.html <form method="post" action="/l ...
- jsp --- jquery
1 给标签 添加属性 $('#principalMoney').attr("disabled", false); $("#career1").css('dis ...
- MYSQL一键安装
#!/bin/bash #baishuchao qq:995345781 ############################################################### ...
- Linux 文件/文件夹无法删除问题解决方案
最近我们的服务器被黑客攻击,然后有些文件的属性被修改,导致我们无法删除病毒文件,同时采用 root 用户也无法删除,现在把解决方案记录下来. 普通删除 如果文件是当前用户的,那么使用 rm 命令就可以 ...
- C语言memcpy函数的用法
介绍 memcpy是memory copy的缩写,意为内存复制,在写C语言程序的时候,我们常常会用到它.它的函原型如下: void *memcpy(void *dest, const void *sr ...
- sau交流学习社区第三方登陆github--oauth来实现用户登录
sau交流学习社区第三方登陆github--oauth来实现用户登录 最近在丰富nodejsBlog开发的“交流学习社区”(https://www.mwcxs.top)的其他功能以及修复一些bug. ...
- 【JVM虚拟机】(8)--深入理解Class中--方法、属性表集合
#[JVM虚拟机](8)--深入理解Class中--方法.属性表集合 之前有关class文件已经写了两篇博客: 1.[JVM虚拟机](5)---深入理解JVM-Class中常量池 2.[JVM虚拟机] ...
- 企业级镜像仓库harbor搭建
企业级镜像仓库harbor搭建 一. Harbor概述 VMware公司最近开源了企业级Registry项目Harbor,其的目标是帮助用户迅速搭建一个企业级的Docker registry 服 ...