日志收集框架 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 处填写上图画红线部分的key
    app.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, Error
ExceptionlessClient.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 Usages
ExceptionlessClient.Default.SubmitFeatureUsage("MyFeature");
ExceptionlessClient.Default.CreateFeatureUsage("MyFeature").AddTags("Exceptionless").Submit();

// 发送一个 404
ExceptionlessClient.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
作者博客:Savorboard
欢迎转载,请在明显位置给出出处及链接

日志收集框架 Exceptionless的更多相关文章

  1. asp.Net Core免费开源分布式异常日志收集框架Exceptionless安装配置以及简单使用图文教程

    最近在学习张善友老师的NanoFabric 框架的时了解到Exceptionless : https://exceptionless.com/ !因此学习了一下这个开源框架!下面对Exceptionl ...

  2. C#实现多级子目录Zip压缩解压实例 NET4.6下的UTC时间转换 [译]ASP.NET Core Web API 中使用Oracle数据库和Dapper看这篇就够了 asp.Net Core免费开源分布式异常日志收集框架Exceptionless安装配置以及简单使用图文教程 asp.net core异步进行新增操作并且需要判断某些字段是否重复的三种解决方案 .NET Core开发日志

    C#实现多级子目录Zip压缩解压实例 参考 https://blog.csdn.net/lki_suidongdong/article/details/20942977 重点: 实现多级子目录的压缩, ...

  3. Net Core免费开源分布式异常日志收集框架Exceptionless

    asp.Net Core免费开源分布式异常日志收集框架Exceptionless安装配置以及简单使用图文教程 https://www.cnblogs.com/yilezhu/p/9193723.htm ...

  4. 【转】asp.Net Core免费开源分布式异常日志收集框架Exceptionless安装配置以及简单使用图文教程

    最近在学习张善友老师的NanoFabric 框架的时了解到Exceptionless : https://exceptionless.com/ !因此学习了一下这个开源框架!下面对Exceptionl ...

  5. ExceptionLess异常日志收集框架-1

    哈哈,中秋和代码更配哦,不知不觉一年过半了,祝园友们中秋快乐 前一阵子在博客园看到了一篇博文 http://www.cnblogs.com/savorboard/p/exceptionless.htm ...

  6. .NET Exceptionless 日志收集框架本地环境搭建

    一.简介 Exceptionless 是一个开源的实时的日志收集框架,它可以应用在基于 ASP.NET,ASP.NET Core,Web Api,Web Forms,WPF,Console,MVC 等 ...

  7. 在.NET Core中使用Exceptionless分布式日志收集框架

    一.Exceptionless简介 Exceptionless 是一个开源的实时的日志收集框架,它可以应用在基于 ASP.NET,ASP.NET Core,Web Api,Web Forms,WPF, ...

  8. 关于Exceptionless日志收集框架会被Fiddler抓包,从而获取到ApiKey的问题

    关于Exceptionless日志收集框架会被Fiddler抓包,从而获取到ApiKey的问题 环境:Exceptionless5.0.0.Linux.WPF客户端.Fiddler 问题:在使用Exc ...

  9. 分布式日志收集框架Flume

    分布式日志收集框架Flume 1.业务现状分析 WebServer/ApplicationServer分散在各个机器上 想在大数据平台Hadoop进行统计分析 日志如何收集到Hadoop平台上 解决方 ...

随机推荐

  1. Heavy Transportation

    题目大意: 雨果的沉重运输是快乐的,当浮空运输出现故障时候他可以扩展业务, 但他需要一个聪明的人告诉他是否真的是一种把他的客户构建了巨型钢起重机的地方需要的所有街道都可以承受重量(这句是直接有道翻译的 ...

  2. MyBatis总结-实现关联表查询

    一.一对一关联 1.1.提出需求 根据班级id查询班级信息(带老师的信息) 1.2.创建表和数据 创建一张教师表和班级表,这里我们假设一个老师只负责教一个班,那么老师和班级之间的关系就是一种一对一的关 ...

  3. .Net动态加载插件-反射

    /// <summary> /// 动态加载插件 /// </summary> void LoadPlugin() { string[] ps = Directory.GetF ...

  4. Hadoop入门--HDFS(单节点)配置和部署 (一)

    一 配置SSH 下载ssh服务端和客户端 sudo apt-get install openssh-server openssh-client 验证是否安装成功 ssh username@192.16 ...

  5. raknet unity3d

    Raknet是一高性能的跨平台的网络库. 他主要基于UDP实现,性能非常好,能够做server. 鉴于unity3d较差的网络支持. 本人成功实现了raknet c# for unity3d的使用,s ...

  6. opengl 函数

    ( 7 )光栅化.象素操作函数. 像素位置 glRasterPos*() .线型宽度 glLineWidth() .多边形绘制模式 glPolygonMode() ,读取象素 glReadPixel( ...

  7. Spring 3 + Quartz 1.8.6 Scheduler Example--reference

    In this tutorial, we will show you how to integrate Spring with Quartz scheduler framework. Spring c ...

  8. iOS iOS8新特性--UIPopoverPresentationController

    1.回顾UIPopoverController的使用,下面这份代码只能在ipad下运行 // 初始化控制器,SecondViewController类继承自UIViewController Secon ...

  9. 使用downloadmanager调用系统的下载

    /** * 文件名 UpdateDownload.java * 包含类名列表 com.issmobile.numlibrary.tool * 版本信息  版本号  * 创建日期 2014年7月14日  ...

  10. (转)Android中使用ormlite实现持久化(一)--HelloOrmLite

    Android中内置了sqlite,但是常用的开发语言java是面向对象的,而数据库是关系型的,二者之间的转化每次都很麻烦(主 要是我对sql语言不熟悉).而Java Web开发中有很多orm框架,但 ...