文章采集系统(一个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