文章采集系统(一个ASP.NETCore日志收集框架,人为的制造一个异常)

优采云 发布时间: 2021-09-20 20:10

  文章采集系统(一个ASP.NETCore日志收集框架,人为的制造一个异常)

  前言

  去年,我向Eric(exception less一)的作者)承诺,我将帮助在中国推广exception less,但由于各种原因,我没有这样做。我向埃里克道歉

  无例外简介

  Exceptionless是一个开源的实时日志采集框架。可应用于基于、核心、web API、web表单、WPF、console、MVC等技术栈的应用,并提供rest接口,可应用于JavaScript和node.js。它使日志采集易于使用,并且不需要知道太多相关的技术细节和配置集

  在过去,我们主要使用log4net、NLog和其他框架来采集日志。当应用程序变得复杂和集群化时,传统的方法可能不太适用,因为采集和分析每个日志会变得麻烦和浪费时间

  现在,无例外团队为我们提供了一个更好的框架。我认为这是非常伟大和有意义的。谢谢他们

  让我们看看

  官方网站:

  GitHub:

  开始

  一、首先,你需要去官网注册一个账号(如果你不能打开它,你知道),注册后登录系统

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

  

  二、按照提示添加项目:

  

  然后可以看到下拉菜单并选择项目类型。您可以看到exceptionless支持许多项目。让我们选择一个核心项目:

  

  @在三、选择之后,将有一个详细的步骤来解释如何在项目中使用它

  

  using Exceptionless;

......

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

{

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

app.UseExceptionless("xxxxxxxxxxxxxxxxxxxxxxxxxx");

app.UseStaticFiles();

app.UseMvc();

}

  此时,exceptionless可以在项目中工作,它将自动在项目中记录异常

  在exceptionless中查看日志

  在入门步骤中,我们创建了一个核心项目。让我们运行它,看看它是如何工作的

  打开homecontroller.cs文件,修改about的操作方法,并人工创建异常消息:

  public IActionResult About() {

throw new Exception("test exception");

return View();

}

  接下来,刷新无例外页面。在仪表板主面板中,您可以看到整个项目的异常,并以多种方式列出它,包括分布图、最常见的异常、最近的异常等

  

  这是我们刚刚在“金额”操作中创建的一个例外。已记录无例外情况。单击以查看详细信息:

  

  

  

  

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

  将事件发送到exceptionless

  除了熟悉的异常信息外,exceptionless还可以记录多种其他信息,统称为事件

  除此之外,还有几种类型的事件:日志、功能使用404、自定义事件

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

}

  发送事件的统一处理

  默认情况下,您可以为exceptionlesclient.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 { "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

  有时,需要在程序中详细记录日志信息,例如在开发阶段。此时,您可以将exceptionless与log4net或NLog结合使用。有关详细信息,请参见此示例

  如果您的程序在短时间内生成大量日志,例如一分钟内生成数千个日志,则需要使用内存中的存储事件,这样客户端就不会将事件序列化到磁盘,因此速度会快得多。通过这种方式,可以使用log4net或NLog将一些事件存储到磁盘,并且可以将无例外事件存储在内存中

  using Exceptionless;

ExceptionlessClient.Default.Configuration.UseInMemoryStorage();

  总结

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

  目前,这个无例外的网站在国外,而且该网站中调用了一些谷歌API,所以在中国访问可能会有点麻烦。你可以科学地上网体验这些功能。毕竟,exceptionless是开源和免费的,服务器可以在本地部署

  如果您认为本文对您有帮助,并且希望更多人了解exceptionless,感谢您的帮助[推荐]

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

  无例外QQ群:330316486

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线