无异常的开源分布式系统日志收集框架无异常

电脑杂谈  发布时间:2020-06-06 21:09:33  来源:网络整理

net分布式数据同步_net分布式系统业务日志_net分布式系统日志统一

每年,我向埃里克(Exceptionless的作者之一)承诺将在中国推广Exceptionless,但是由于种种原因,我没有这样做,所以我向Eric道歉. : )

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

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

现在,Exceptionless团队为我们提供了一个更好的框架来实现这一目标,我认为这是非常伟大而有意义的,谢谢他们.

让我们看看.

官方网站:

GitHub:

首先,首先,您需要访问官方网站注册一个帐户(您知道哪些学生无法开通),并在注册完成后登录系统.

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

640?wx_fmt=png

net分布式系统日志统一_net分布式数据同步_net分布式系统业务日志

第二,按照提示添加项目:

640?wx_fmt=png

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

640?wx_fmt=png

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

640?wx_fmt=png

using Exceptionless;
......public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory){    // xxxxx 处填写上图画红线部分的key
    app.UseExceptionless("xxxxxxxxxxxxxxxxxxxxxxxxxx");
    app.UseStaticFiles();
    app.UseMvc();
}

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

在“入门”步骤中net分布式系统日志统一,我们创建了一个ASP.NET Core项目. 让我们运行它,看看它如何工作.

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

net分布式数据同步_net分布式系统日志统一_net分布式系统业务日志

public IActionResult About() {    throw new Exception("test exception");   
    return View();
}

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

640?wx_fmt=png

我们刚刚在Abount Action中创建的此例外记录为Exceptionless,单击它后,您可以看到详细信息:

640?wx_fmt=png

640?wx_fmt=png

640?wx_fmt=png

640?wx_fmt=png

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

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

net分布式系统日志统一_net分布式数据同步_net分布式系统业务日志

在例外情况下,事件类型有以下几种: 日志,功能使用,404,自定义事件.

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

using Exceptionless;// 发送日志
ExceptionlessClient.Default.SubmitLog("Logging made easy");// 你可以指定日志来源,和日志级别。// 日志级别有这几种: Trace, Debug, Info, Warn, ErrorExceptionlessClient.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 UsagesExceptionlessClient.Default.SubmitFeatureUsage("MyFeature"); ExceptionlessClient.Default.CreateFeatureUsage("MyFeature").AddTags("Exceptionless").Submit();// 发送一个 404ExceptionlessClient.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();
}

统一处理已发送事件

net分布式数据同步_net分布式系统业务日志_net分布式系统日志统一

默认情况下,您可以将额外的事件绑定到ExceptionlessClient.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<string> { "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.

原始地址:


本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-236388-1.html

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      热点图片
      拼命载入中...