整套解决方案:免费开源分布式系统日志收集框架 Exceptionless
优采云 发布时间: 2020-09-05 12:34免费和开源的分布式系统日志采集框架无一例外
前言
我向埃里克(去年的作者一)承诺,他将在中国推广埃里克斯无奈,但由于种种原因,我没有这样做,我向埃里克表示歉意。
无与伦比的介绍
Exceptionless是一个开源实时日志采集框架,可以在基于ASP.NET,ASP.NET Core,Web Api,Web Forms,WPF,控制台,MVC和其他技术堆栈的应用程序中使用,并提供Rest接口可以在Javascript和Node.js中使用。它使日志采集变得简单易用,并且不需要了解太多相关的技术细节和配置。
过去,我们主要使用Log4net,Nlog和其他框架进行日志采集。当应用程序变得复杂且集群化时,传统方法可能不太适合,因为采集各种日志并进行分析会改变它的麻烦和时间浪费。
现在,Exceptionless团队为我们提供了更好的框架。我认为这很棒而且有意义。谢谢他们。
让我们看看。
官方网站:
GitHub:
入门
一、首先,您需要进入官方网站注册帐户(您知道是否无法打开帐户),并在注册后登录系统。
ps:无与伦比的系统也可以部署到本地服务器
二、按照提示添加您的项目之一:
然后您将看到一个下拉菜单,选择项目类型,您可以看到Exceptionless支持多种项目。让我们选择一个ASP.NET Core项目:
三、选择完成后,将有一个详细的步骤,说明如何在项目中使用它。
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();
}
接下来,刷新“例外”页面。在仪表板的主仪表板中,您可以看到有关整个项目的异常,该异常以几种方式列出,包括分布图,最频繁的异常和最新的Exception等。
这是我们刚刚在Abount Action中创建的一个例外,已经记录了Exceptionless,您可以在单击后查看详细信息:
在上图中,您可以直观地看到异常的一些特定信息。除了一些基本的异常类型,时间和堆栈外,它还包括访问者的坐标,IP地址,发生异常的URL地址以及浏览器信息,操作系统,甚至是发生异常时请求的cookie值。<//p
p将事件发送到异常/p
p除了熟悉的异常信息外,Exceptionless还可以记录许多其他类型的信息,这些信息统称为事件。/p
p在例外情况下,事件有几种类型:日志(日志),功能用法(函数用法),40 4、自定义事件(自定义事件)。/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。