免费开源分布式系统日志收集框架 Exceptionless

前言

从去年就答应过Eric(Exceptionless的作者之一),在中国会帮助给 Exceptionless 做推广,但是由于各种原因一直没有做这件事情,在此对Eric表示歉意。:)

Exceptionless 简介

Exceptionless 是一个开源的实时的日志收集框架,它可以应用在基于 ASP.NET,ASP.NET Core,Web Api,Web Forms,WPF,Console,MVC 等技术栈的应用程序中,并且提供了Rest接口可以应用在 Javascript,Node.js 中。它将日志收集变得简单易用并且不需要了解太多的相关技术细节及配置。

在以前,我们做日志收集大多使用 Log4net,Nlog 等框架,在应用程序变得复杂并且集群的时候,可能传统的方式已经不是很好的适用了,因为收集各个日志并且分析他们将变得麻烦而且浪费时间。

现在Exceptionless团队给我们提供了一个更好的框架来做这件事情,我认为这是非常伟大并且有意义的,感谢他们。

就让我们一起来看看吧。

官网:http://exceptionless.com/

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

Getting Started

一、首先,需要去官网注册一个帐号(打不开的同学你懂的),注册完成之后登录系统。

ps :Exceptionless 的系统也可以部署到本地服务器哦

二、按照提示,添加一个你的项目:

然后可以看到一个下拉菜单,选择项目的类型,可以看到 Exceptionless支持很多种项目。我们来选择一个 ASP.NET Core 的项目:

三、选择完成之后,会有一个详细的步骤,说明了如何做项目中使用。

  • 首先,使用 NuGet 添加一个包,名字叫Exceptionless.AspNetCore

  • 在 ASP.NET Core 项目中,打开startup.cs文件,找到Configure()方法,添加如下:

using Exceptionless;
......public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory){    // xxxxx 处填写上图画红线部分的keyapp.UseExceptionless("xxxxxxxxxxxxxxxxxxxxxxxxxx");app.UseStaticFiles();app.UseMvc();
}

至此,Exceptionless 已经可以在你的项目中工作了,它会自动记录项目中的异常情况。

在 Exceptionless 查看日志

在 Getting Started 步骤,我们创建了一个 ASP.NET Core 项目,下面我们来运行一下,看看它是怎么工作的吧。

打开 HomeController.cs文件,修改About的action方法,人为的制造一个异常信息:

public IActionResult About() {    throw new Exception("test exception");   return View();
}

接下来,刷新 Exceptionless的页面,在 Dashboard 主面板中,可以看到关于整个项目的一个异常情况,并且分别以几种方式列了出来,其中包括分布图,最频繁的异常,最近的异常等等。

这个我们刚才在Abount Action中制造的一个异常,Exceptionless已经记录了下来,点进去之后可以看一下详情:




在上图中,可以很直观的看出异常的一些具体信息,除了一些基本的异常类型、时间和堆栈外,还包括访问者的坐标、IP地址、发生异常的URL地址、浏览器信息,操作系统、甚至发生异常时请求的Cookie值。

向 Exceptionless 发送事件

除了我们所熟悉的异常信息外,Exceptionless 还可以记录很多种类的其他信息,这些信息统称做事件(Event)。

在Exceptionless 中,有这几类事件: Log (日志)、Feature Usages(功能用途)、404、Custom Event(自定义事件)。

Exceptionless 中发送不同类型事件很简单,代码如下:

using Exceptionless;// 发送日志
ExceptionlessClient.Default.SubmitLog("Logging made easy");// 你可以指定日志来源,和日志级别。// 日志级别有这几种: Trace, Debug, Info, Warn, ErrorExceptionlessClient.Default.SubmitLog(typeof(Program).FullName, "This is so easy", "Info"); ExceptionlessClient.Default.CreateLog(typeof(Program).FullName, "This is so easy", "Info").AddTags("Exceptionless").Submit();// 发送 Feature UsagesExceptionlessClient.Default.SubmitFeatureUsage("MyFeature"); ExceptionlessClient.Default.CreateFeatureUsage("MyFeature").AddTags("Exceptionless").Submit();// 发送一个 404ExceptionlessClient.Default.SubmitNotFound("/somepage"); ExceptionlessClient.Default.CreateNotFound("/somepage").AddTags("Exceptionless").Submit();// 发生一个自定义事件ExceptionlessClient.Default.SubmitEvent(new Event { Message = "Low Fuel", Type = "racecar", Source = "Fuel System" });

手动发送一个已处理的异常

有时候,我们在程序代码中显式的处理一些异常,这个时候可以手动的来将一些异常信息发送到Exceptionless。

try {   
 throw new ApplicationException(Guid.NewGuid().ToString()); } catch (Exception ex) {ex.ToExceptionless().Submit(); }

为发送的事件添加额外的标记

在发送一个事件的时候,可以为当前事件添加额外的上下文信息进行发送,如果添加坐标、标签、属性等等。

try {    throw new ApplicationException("Unable to create order from quote.");
} 
catch (Exception ex) 
{ex.ToExceptionless()        // 为事件设定一个编号,以便于你搜索 .SetReferenceId(Guid.NewGuid().ToString("N"))        // 添加一个不包含CreditCardNumber属性的对象信息.AddObject(order, "Order", excludedPropertyNames: new [] { "CreditCardNumber" }, maxDepth: 2)        // 设置一个名为"Quote"的编号.SetProperty("Quote", 123)        // 添加一个名为“Order”的标签.AddTags("Order")        // 标记为关键异常.MarkAsCritical()        // 设置一个地理位置坐标.SetGeo(43.595089, -88.444602)        // 设置触发异常的用户信息.SetUserIdentity(user.Id, user.FullName)        // 设置触发用户的一些描述.SetUserDescription(user.EmailAddress, "I tried creating an order from my saved quote.")        // 发送事件.Submit();
}

统一处理发送的事件

你可以默认的为ExceptionlessClient.Default.SubmittingEvent绑定额外的事件,来统一自定义一些处理。

ExceptionlessClient.Default.SubmittingEvent += OnSubmittingEvent;private void OnSubmittingEvent(object sender, EventSubmittingEventArgs e) {    // 仅处理未被处理过的异常if (!e.IsUnhandledError)        return;    // 忽略404事件if (e.Event.IsNotFound()) {e.Cancel = true;        return;}    // 获取error对象var error = e.Event.GetError();    if (error == null)        return;    // 忽略 401 或 `HttpRequestValidationException`异常if (error.Code == "401" || error.Type == "System.Web.HttpRequestValidationException") {e.Cancel = true;        return;}    // 忽略不是指定命名空间代码抛出的异常var handledNamespaces = new List<string> { "Exceptionless" };    if (!error.StackTrace.Select(s => s.DeclaringNamespace).Distinct().Any(ns => handledNamespaces.Any(ns.Contains))) {e.Cancel = true;        return;}e.Event.AddObject(order, "Order", excludedPropertyNames: new [] { "CreditCardNumber" }, maxDepth: 2);e.Event.Tags.Add("Order");e.Event.MarkAsCritical();e.Event.SetUserIdentity(user.EmailAddress);
}

配合使用 NLog 或 Log4Net

有时候,程序中需要对日志信息做非常详细的记录,比如在开发阶段。这个时候可以配合 log4net 或者 nlog 来联合使用 exceptionless,详细可以查看这个 示例。

如果你的程序中有在短时间内生成大量日志的情况,比如一分钟产生上千的日志。这个时候你需要使用内存存储(in-memory store)事件,这样客户端就不会将事件系列化的磁盘,所以会快很多。这样就可以使用Log4net 或者 Nlog来将一些事件存储到磁盘,另外 Exceptionless 事件存储到内存当中。

using Exceptionless;ExceptionlessClient.Default.Configuration.UseInMemoryStorage();

总结

本篇主要是对 Exceptionless 做了一个介绍,然后介绍了 Exceptionless 是怎么发送日志的。
因为目前 Exceptionless 的站点在国外,并且站点里面调用了一些 google 的 api,所以可能在中国访问起来有点麻烦,大家可以先科学上网体验一下功能。毕竟 Exceptionless 是开源免费的并且服务端也是可以本地部署的。

如果您觉得本文对您有帮助,想让更多人了解Exceptionless,感谢您帮忙点的【推荐】。

如果您对 Exceptionless 感兴趣或者是想学习 Exceptionless 的代码,可以加入群。

Exceptionless QQ群:330316486

原文地址:http://www.cnblogs.com/savorboard/p/exceptionless.html


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

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

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

相关文章

如何安装mysql5.5.6_centos6安装mysql5.5.53

MysqL官网下载MysqL的red hat linux安装包下载地址为&#xff1a;http://dev.MysqL.com/downloads/MysqL/5.5.html#downloads下载后的文件为&#xff1a;MysqL-5.5.53-1.el7.x86_64.rpm-bundle.tar解压 tar 包 &#xff1a;tar -xvf MysqL-5.5.53-1.el7.x86_64.rpm-bundle.tar移…

java职业规划

百度搜索java职业规划好多啊啊啊

避免同步死锁

翻译自 避免同步死锁在我之前的文章“ Double-Checked Locking&#xff1a;Clever&#xff0c;but Broken ”&#xff08;JavaWorld&#xff0c;2001年2月&#xff09;&#xff0c;我描述了几种常用的避免同步的技术实际上是不安全的&#xff0c;并建议了一个“如有疑问&#…

程序员小测试:保守派 vs 自由派

最近&#xff0c;我在阅读 Steve Yegg 的文集《程序员的呐喊》。 这是一本非常有趣的书&#xff0c;里面甚至包含了一个小测试&#xff08;原文&#xff09;&#xff0c;区分一个程序员到底是保守派还是自由派。 下面一共有十个问题&#xff0c;每个问题都有 A 和 B 两个选项&a…

新闻发布项目——业务逻辑层(newsTbService)

package bdqn.newsManageServlet.Service;import java.util.List;import bdqn.newsManageServlet.entity.newsTb;/*** 新闻业务逻辑层的接口* author Administrator**/ public interface newsTbService {//分页查询public List<newsTb>getPagingNews(int pagesize,int pa…

django mysql 创建表_关于 django ORM 中,数据库建表方式的问题

本人以前是做客户端的&#xff0c;做后端没多久。一直有一个问题困扰我&#xff0c;正好现在手上有一个系统在做。系统逻辑是写一个爬虫在网上爬取一个网站的信息&#xff0c;经过加工处理后&#xff0c;使用 django 来展示和交互。表结构简化为三张表A:爬虫爬取得到的信息B:数…

遍历多叉树

https://www.jianshu.com/p/dee8284b2dc4 beg4 关注 2018.03.22 15:14* 字数 334 阅读 172评论 0喜欢 1 随便画一个树,写代码遍历它 OK,树的结构这么描述 public class TreeNode {private String name;private TreeNode parent;private List<TreeNode> children new …

tomcat与apache的面试题

转载自 tomcat与apache的面试题tomcat与apache有哪几种连接方式&#xff1f; Tomcat 与 Apache 有三种连接方式&#xff0c; 1、JK方式 这是最常见的方式。JK 是通过 AJP 协议与 Tomcat 服务器进行通讯的&#xff0c;Tomcat 默认的 AJP Connector 的端口是 8009。JK 本身提供…

使用 Exceptionless 作为 Log Server 搭配 NLog 记录系统日志

昨天的文章<免费开源分布式系统日志收集框架 Exceptionless>反响很大,今天推的一篇是续集,文章来自于宝岛台湾的MVP, 让 Exceptionless 建置 Log Server,性能不用担心,用的是大名点点的ELK组合. 前言 痾...久违的新文章&#xff0c;让我的眼角流下了蛋蛋忧伤的泪珠.... 今…

elementui下拉框选择图片_element ui下拉框如何实现默认选择?

为什么我这样写没反应呢运营商级别 <el-optionv-for"item in options1":label"item.label":value"item.value"></el-option>export default{data(){return{selected:,options1:[{value: 选项1,label: 省级运营商}, {value: 选项2,la…

程序员成长之路 java面试指导(作者说的极好要看) 静下心看

https://blog.csdn.net/weixin_41780944/article/details/79429769 从面试官的角度分享一些后端校招经验&#xff08;作者说的极好要看&#xff09; https://blog.csdn.net/qq_34337272/article/details/80875016 除了手写代码和计算机基础&#xff0c;剩下的方面都是可选项…

[MySQL] 二进制的应用场景

前言 MySQL 是一种常用的关系型数据库管理系统&#xff0c;广泛应用于各种软件和网站开发中。在 MySQL 中&#xff0c;数据以二进制文件的形式存储在硬盘上。这些二进制文件不仅可以提供数据的持久化存储&#xff0c;还可以在不同的应用场景中发挥重要作用。本文将介绍 MySQL …

各种面试题(二)

转载自 各种面试题(二)1、面向对象的特征有哪些方面? 封装&#xff1a;通常认为封装是把数据和操作数据的方法绑定起来&#xff0c;对数据的访问只能通过已定义的接口。 多态性&#xff1a;多态性是指允许不同子类型的对象对同一消息作出不同的响应。简单的说就是用同样的对象…

亚马逊如何变成 SOA(面向服务的架构)?

上一篇文章&#xff0c;我摘录了《程序员的呐喊》。这本书有趣的内容太多&#xff0c;今天再摘录一段。 1、 亚马逊公司不仅是世界最大的网络书店&#xff0c;还是世界最大的云服务商。它是怎么实现从电商到云商的转变呢&#xff1f; 一切都是CEO杰夫贝索斯促成的&#xff0c;他…

新闻发布项目——业务逻辑层(commentService)

package bdqn.newsManageServlet.Service;import java.util.List;import bdqn.newsManageServlet.Dao.commentDao; import bdqn.newsManageServlet.Dao.Impl.commentDaoImpl; import bdqn.newsManageServlet.entity.comment;/*** 新闻评论的业务逻辑层* author Administrator**…

linux 安装mysql 8.0_Linux安装mysql 8.0的详细方法介绍(代码示例)

本篇文章给大家带来的内容是关于Linux安装mysql 8.0的详细方法介绍(代码示例)&#xff0c;有一定的参考价值&#xff0c;有需要的朋友可以参考一下&#xff0c;希望对你有所帮助。经过一番努力下载mysql文件&#xff0c;我们可以开始Mysql8.0的安装了。解压文件// 解压文件生成…

亚信科技笔试面试2019届

首先笔试 笔试超级难 jsp 数据库 java 很多要百度 记得多找几个小伙伴哦~ 面试 一面: 技术面 讲一下你的项目 根据你的项目提问 面试官&#xff1a; 有哪些排序算法 我:冒泡 面试官&#xff1a; 只有一个冒泡? 我: 还有选择吧(我怕手写 &am…

Xamarin支持微软HoloLens混合现实开发

今年年初&#xff0c;微软以4亿美元的价格收购移动开发工具Xamarin&#xff0c;Xamarin允许开发者编写跨平台应用&#xff0c;提供Android、iOS和Windows10上原生应用体验。微软收购Xamarin后&#xff0c;Xamarin变得更加开放&#xff0c;比如Visual Studio用户免费使用&#x…

mysql fpmmm_zabbix配fpmmm(mpm)数据传送不了问题解决

我们环境用zabbix mpm来监控mysql&#xff0c;不过最近官网已经不叫mpm了&#xff0c;而是叫fpmmm&#xff0c;理由为&#xff1a;fpmmm is the successor of mpm. mpm was renamed to fpmmm because of the naming conflict with the Apache Multi-Processing Modules (MPM).好…

各种面试题(一)

转载自 各种面试题(一)1.说说你对缓存的理解&#xff1f; 1.使用缓存的目的&#xff1a; 提高应用程序的性能&#xff0c;减少到数据库的访问次数 2.缓存的介质&#xff08;缓存的存储位置&#xff09; 内存&#xff1a;临时性存储空间 存取数据快 减少网络通信量 硬盘&#…