免费和开源的分布式系统日志采集框架无一例外
优采云 发布时间: 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
欢迎转载,请在明显的位置注明出处和链接