分布式日志 Exceptionless 项目中的应用

1、前言

在Docker系列中讲述关于如何在docker下安装日志收集Exceptionless框架工具,接下来主要讲述如何在项目中应用Exceptionless进行日志收集,在以前,我们做日志收集大多使用 Log4net,Nlog 等框架,在应用程序变得复杂并且集群的时候,可能传统的方式已经不是很好的适用了,因为收集各个日志并且分析他们将变得麻烦而且浪费时间,现在Exceptionless给我们提供更好的框架来做这些事。2、内容

  • 在Exceptionless搭建项目获取Key分布式日志 Exceptionless 项目中的应用

    根据引导页的提示,在NetCore项目中引入Exceptionless.AspNetCore,如何需要结合Log4Net输出日志,需要在引入 Exceptionless.Log4net。

  • appsettings.json配置
      "Exceptionless": {    "ApiKey": "4F3rXsavY7zcs4ZnZA7vN3A8qOK5zpouwVXzeIm1",    "ServerUrl": "http://XXXX:5000"  }
  • Startup中配置
    //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()}

    分布式日志 Exceptionless 项目中的应用

  • 中间件统一日志收集及异常日志
    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还有更深入的运用。

  • 声明:版权归原创所有,转载此文是出于传递更多信息之目的。若有来源标注错误或侵犯了您的合法权益,请与本网联系,我们将及时更正、删除,谢谢。
    上上吉
    创业项目

    牙科暴利是真实的吗(妇幼和牙科哪个暴利)

    今天闲来聊一聊牙科暴利这件事情。很多人提到看牙,脑子里或者嘴里总会飘出一句话,牙科太暴利了。牙科到底暴利吗,人们的这个观念到底是怎么样形成的?很多利润比牙科高的行业没太多人说暴利,为什么单单牙科就这么...
    创业项目

    回收行业100种赚钱方法(回收什么比较冷门)

    摘要:本文给大家分享几个农村回收好项目,希望大家能认真看完,1回收农作物秸秆,我看网上有人说回收农作物秸秆是骗人的,我可以这么说,那是因为你没有找对人,是别人骗了你,可是不能将这个项目都给否定掉,事实...
    匿名

    发表评论

    匿名网友 填写信息

    :?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: