1、前言
在Docker系列中讲述关于如何在docker下安装日志收集Exceptionless框架工具,接下来主要讲述如何在项目中应用Exceptionless进行日志收集,在以前,我们做日志收集大多使用 Log4net,Nlog 等框架,在应用程序变得复杂并且集群的时候,可能传统的方式已经不是很好的适用了,因为收集各个日志并且分析他们将变得麻烦而且浪费时间,现在Exceptionless给我们提供更好的框架来做这些事。2、内容
根据引导页的提示,在NetCore项目中引入Exceptionless.AspNetCore,如何需要结合Log4Net输出日志,需要在引入 Exceptionless.Log4net。
"Exceptionless": { "ApiKey": "4F3rXsavY7zcs4ZnZA7vN3A8qOK5zpouwVXzeIm1", "ServerUrl": "http://XXXX:5000" }
//ConfigureServicesExceptionlessClient.Default.Configuration.ApiKey = configuration.GetSection("Exceptionless:ApiKey").Value;ExceptionlessClient.Default.Configuration.ServerUrl = configuration.GetSection("Exceptionless:ServerUrl").Value;ExceptionlessClient.Default.Configuration.SetDefaultMinLogLevel(Exceptionless.Logging.LogLevel.Info); // 设置后,Exceptionless 才可以显示Info信息//Configureapp.UseExceptionless();//异常测试try { throw new ApplicationException("Unable to create order from quote.");} catch (Exception ex) { ex.ToExceptionless()}
public class LoggerFilterAttribute : IActionFilter, IResultFilter{ /// <summary> /// /// </summary> /// <param name="context"></param> public void OnResultExecuted(ResultExecutedContext context) { var Controller = context.ActionDescriptor.RouteValues.ToList(); var MethodName = Controller[0].Value; var ControllerName = Controller[1].Value; try { JsonResult obj = null; try { obj = (JsonResult)context.Result; } catch { return; } var response = new ApiResponseModel { //取得由API返回的状态代码 StatusCode = context.HttpContext.Response.StatusCode, Data = JsonConvert.SerializeObject(obj.Value, Formatting.Indented, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore }) }; var request = new ApiRequestModel { Path = #34;{context.HttpContext.Request.Path.Value}{context.HttpContext.Request.QueryString.Value ?? string.Empty}" }; context.HttpContext.Request.Body.Position = 0; if (context.HttpContext.Request.ContentLength > 0) { using var reader = new System.IO.StreamReader(context.HttpContext.Request.Body); request.Body = reader.ReadToEnd(); } ExceptionlessClient.Default.CreateLog("[" + ControllerName + "]-[" + MethodName + "]", LogLevel.Info) .SetSource("[" + ControllerName + "]-[" + MethodName + "]") .SetMessage("接口请求: " + JsonConvert.SerializeObject(request, Formatting.Indented)) .SetProperty("接口返回: ", JsonConvert.SerializeObject(response, Formatting.Indented)) .AddTags(ControllerName) .AddTags(MethodName) .Submit(); } catch (Exception ex) { ex.ToExceptionless().AddTags(ControllerName) .AddTags(MethodName) .Submit(); } } }
/// <summary>/// 日志中间件/// </summary>public class LoggerExceptionAttribute : ExceptionFilterAttribute{ /// <summary> /// 异常处理 /// </summary> /// <param name="context"></param> public override async Task OnExceptionAsync(ExceptionContext context) { await base.OnExceptionAsync(context); var routename = context.HttpContext.Request.Path.Value.ToString(); context.Exception.ToExceptionless().AddTags(routename).Submit(); try { var body = string.Empty; try { //context.HttpContext.Request.EnableBuffering();// 3.0 替代 EnableRewind();//倒带功能,解决多次读取Body问题 放到 StartUp中 context.HttpContext.Request.Body.Position = 0; if (context.HttpContext.Request.ContentLength > 0) { using var reader = new System.IO.StreamReader(context.HttpContext.Request.Body); body = await reader.ReadToEndAsync(); } } catch { } var message = #34;\r\n - Source:{routename} \r\n - Body {body} \r\n - Message:{context.Exception?.Message}"; logger.Info(message); logging.LogInformation(message); } catch { } var response = new { Code = Code.Exception, Msg = Constants.Exception }; context.Result = new ObjectResult(response); context.HttpContext.Response.StatusCode = (int)System.Net.HttpStatusCode.InternalServerError; context.ExceptionHandled = true; }}
注:在WebApi中 数据日志没有收集到,需要在Startup上增加RequestDelegate委托类型获取。
app.Use(next => new RequestDelegate( async context => { context.Request.EnableBuffering(); await next(context); }));
3、结语
Exceptionless 还有很多很灵活的用法,这里就不详细的说明了。这里只是一个简单指引和运用,希望以上内容对你有所帮助,当然Exceptionless还有更深入的运用。
声明:版权归原创所有,转载此文是出于传递更多信息之目的。若有来源标注错误或侵犯了您的合法权益,请与本网联系,我们将及时更正、删除,谢谢。
评论