免费和开源的分布式系统日志采集框架无一例外

优采云 发布时间: 2020-08-07 15:31

  前言

  我去年曾答应埃里克(《无尽之境》的作者之一)帮助在中国推广“无尽之境”,但出于各种原因,我没有做到这一点. 我向埃里克道歉.

  无与伦比的介绍

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

  过去,我们主要使用Log4net,Nlog和其他框架进行日志采集. 当应用程序变得复杂且集群化时,传统方法可能不太适合,因为采集各种日志并对其进行分析将发生变化. 这很麻烦,很浪费时间.

  现在,卓越团队为我们提供了更好的框架. 我认为这很棒而且有意义. 谢谢他们.

  让我们一起看看. ​​

  官方网站:

  GitHub:

  入门

  1. 首先,您需要访问官方网站注册一个帐户(您知道是否无法打开),然后在注册后登录系统.

  ps: 无例外的系统也可以部署到本地服务器

  

  2. 按照提示添加您的项目:

  

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

  

  3. 选择完成后,将有一个详细的步骤,说明如何在项目中使用它.

  

  using Exceptionless;

......

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)

{

// xxxxx 处填写上图画红线部分的key

app.UseExceptionless("xxxxxxxxxxxxxxxxxxxxxxxxxx");

app.UseStaticFiles();

app.UseMvc();

}

  这时,Exceptionless已经可以在您的项目中工作,它将自动在项目中记录异常.

  检查日志是否异常

  在“入门”步骤中,我们创建了一个ASP.NET Core项目. 让我们运行它,看看它如何工作.

  打开HomeController.cs文件并修改“关于”的操作方法以人为地创建异常消息:

  public IActionResult About() {

throw new Exception("test exception");

return View();

}

  接下来,刷新“例外”页面. 在仪表板的主仪表板中,您可以看到有关整个项目的异常,并且以多种方式列出了异常,包括分布图,最常见的异常和最新的异常等.

  

  这是我们刚刚在Abount Action中创建的例外. 例外情况已被记录. 单击后,您可以查看详细信息:

  

  

  

  

  在上图中,您可以直观地看到异常的一些特定信息. 除了一些基本的异常类型,时间和堆栈外,它还包括访问者的坐标,IP地址,发生异常的URL地址,以及浏览器信息,操作系统,甚至是发生异常时请求的cookie值. <//p

p将事件发送到异常/p

p除了熟悉的异常信息外,Exceptionless还可以记录许多其他信息,这些信息统称为事件./p

p在无与伦比的情况下,事件有几种类型: 日志,功能使用,404,自定义事件./p

p在Exceptionless中发送不同类型的事件非常简单,代码如下:/p

pprecodeusing 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" });

/code/pre/p

p手动发送已处理的异常/p

p有时,我们在程序代码中显式处理一些异常. 目前,我们可以手动将一些异常信息发送给Exceptionless./p

pprecodetry

{

throw new ApplicationException(Guid.NewGuid().ToString());

}

catch (Exception ex)

{

ex.ToExceptionless().Submit();

}

/code/pre/p

p在发送的事件中添加其他标签/p

p发送事件时,如果添加坐标,标签,属性等,则可以为当前事件添加其他上下文信息./p

pprecodetry

{

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();

}

/code/pre/p

p统一处理已发送事件/p

p默认情况下,您可以将其他事件绑定到ExceptionlessClient.Default.SubmittingEvent,以统一自定义某些处理./p

pprecodeExceptionlessClient.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 Liststring { "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一起使用. 您可以查看此示例以了解详细信息.

  如果程序在短时间内生成大量日志,例如每分钟数千个日志. 这时,您需要使用内存中的存储事件,以便客户端不将事件序列化到磁盘,这样会更快. 这样,您可以使用Log4net或Nlog将某些事件存储到磁盘,并将无异常事件存储在内存中.

  using Exceptionless;

ExceptionlessClient.Default.Configuration.UseInMemoryStorage();

  摘要

  本文主要介绍Exceptionless,然后介绍Exceptionless如何发送日志.

  由于Exceptionless网站目前在国外,并且该网站中调用了一些Google API,因此在中国访问可能会有些麻烦. 您首先可以科学地体验这些功能. 毕竟,Exceptionless是开源且免费的,并且服务器也可以在本地部署.

  如果您认为本文对您有所帮助,并希望更多的人了解Exceptionless,请多谢您的帮助.

  如果您对Exceptionless感兴趣或想学习Exceptionless的代码,可以加入该小组.

  无与伦比的QQ组: 330316486.

  本文的地址:

  作者博客: Savorboard

  欢迎转载,请在明显的位置注明出处和链接

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线