Net Core集成Exceptionless分布式日志功能以及全局异常过滤
相信很多朋友都看过我的上篇关于Exceptionless的简单入门教程[asp.Net Core免费开源分布式异常日志收集框架Exceptionless安装配置以及简单使用图文教程][https://www.cnblogs.com/yilezhu/p/9193723.html] 上篇文章只是简单的介绍了Exceptionless是什么?能做什么呢?以及怎么进行本地部署和异常提交的简单用法,而这篇文章将带你探讨一下Exceptionless的异常收集高级用法以及你熟悉的类似NLog的日志用法。
这篇文章有一部分内容翻译自官方文档,[点我阅读][https://github.com/exceptionless/Exceptionless.Net/wiki/Sending-Events] 英语好的可以自行阅读 。当然中间很多代码我都进行了重构,还有参考周旭龙的代码,进行了简单地封装,同时加入了为webapi加入异常全局过滤器进行异常日志的记录。希望对大家有所帮助。
本文地址:https://www.cnblogs.com/yilezhu/p/9339017.html
作者:依乐祝
上篇文章介绍了,导入命名空间后,并使用如下代码就可以简单地提交异常日志:
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() // 设置一个ReferenceId方便查找 .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) // 在你的系统中设置userid并提供一个有好的名字,俗称昵称 .SetUserIdentity(user.Id, user.FullName) // 为异常信息添加一些用户描述信息. .SetUserDescription(user.EmailAddress, "I tried creating an order from my saved quote.") // 提交. .Submit(); } 统一修改未处理的异常报告你可以在通过SubmittingEvent 事件设置全局的忽略异常信息添加一些自定义信息等等
#region Exceptionless配置 ExceptionlessClient.Default.Configuration.ApiKey = exceptionlessOptions.Value.ApiKey; ExceptionlessClient.Default.Configuration.ServerUrl = exceptionlessOptions.Value.ServerUrl; ExceptionlessClient.Default.SubmittingEvent += OnSubmittingEvent; app.UseExceptionless(); #endregion /// <summary> /// 全局配置Exceptionless /// </summary> /// <param></param> /// <param></param> private void OnSubmittingEvent(object sender, EventSubmittingEventArgs e) { // 只处理未处理的异常 if (!e.IsUnhandledError) return; // 忽略404错误 if (e.Event.IsNotFound()) { e.Cancel = true; return; } // 忽略没有错误体的错误 var error = e.Event.GetError(); if (error == null) return; // 忽略 401 (Unauthorized) 和 请求验证的错误. if (error.Code == "401" || error.Type == "System.Web.HttpRequestValidationException") { e.Cancel = true; return; } // Ignore any exceptions that were not thrown by our code. 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("MunicipalPublicCenter.BusinessApi"); e.Event.MarkAsCritical(); //e.Event.SetUserIdentity(); } 配合使用 NLog 或 Log4Net有时候,程序中需要对日志信息做非常详细的记录,比如在开发阶段。这个时候可以配合 log4net 或者 nlog 来联合使用 exceptionless,详细可以查看这个官方的 [示例][https://github.com/exceptionless/Exceptionless.Net/tree/master/samples/Exceptionless.SampleConsole]。
如果你的程序中有在短时间内生成大量日志的情况,比如一分钟产生上千的日志。这个时候你需要使用内存存储(in-memory store)事件,这样客户端就不会将事件系列化的磁盘,所以会快很多。这样就可以使用Log4net 或者 Nlog来将一些事件存储到磁盘,另外 Exceptionless 事件存储到内存当中。
Exceptionless 日志记录的封装
首先简单地封装一个ILoggerHelper接口
/// <summary> /// lzhu /// 2018.7.19 /// 日志接口 /// </summary> public interface ILoggerHelper { /// <summary> /// 记录trace日志 /// </summary> /// <param>信息来源</param> /// <param>日志内容</param> /// <param>标记</param> void Trace(string source, string message, params string[] args); /// <summary> /// 记录debug信息 /// </summary> /// <param>信息来源</param> /// <param>日志内容</param> /// <param>标记</param> void Debug(string source, string message, params string[] args); /// <summary> /// 记录信息 /// </summary> /// <param>信息来源</param> /// <param>日志内容</param> /// <param>标记</param> void Info(string source, string message, params string[] args); /// <summary> /// 记录警告日志 /// </summary> /// <param>信息来源</param> /// <param>日志内容</param> /// <param>标记</param> void Warn(string source, string message, params string[] args); /// <summary> /// 记录错误日志 /// </summary> /// <param>信息来源</param> /// <param>日志内容</param> /// <param>标记</param> void Error(string source, string message, params string[] args); }