栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

asp.net core添加全局异常处理及log4net、Nlog应用

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

asp.net core添加全局异常处理及log4net、Nlog应用

0、目录

 整体架构目录:ASP.NET Core分布式项目实战-目录

一、介绍

 

此篇文章将会介绍项目的全局异常收集以及采用log4net或者NLog记录。

众所周知,一旦自己的项目报错,如果没有进行处理都是显示不友好的,有得甚至直接爆出错误页面,看的也是很奇怪。

 为了避免出现这样的错误以及在错误出现的时候可以进行收集错误,供维护人员进行bug修改,因此需要进行全局异常的收集。

 让我们开始部署吧。

 

此篇文章的目录

1、log4net使用

2、Nlog使用

后期将会把NLog+ELK进行结合部署收集我们的asp.net core的项目。大家可以拭目以待吧。

 

二、部署(log4net使用)

 

1、新建一个asp.net core webapi的项目

然后目前我先引入 log4net   nuget包。

2、然后创建一个log4net.config文件

此文件中,我创建了一个是记录 错误的文件夹(LogError)以及是记录操作的文件夹(LogInfo),代码如下:我把需要记录的文件放在了log文件夹下面。



  
    
    
      
      
    
    
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
        
      
    

    
    
      
      
    
    
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
        
      
    
  


  
  

 

3、在asp.net core项目中 Startup.cs 中需要添加初始化log4net的仓储名,主要是用来给log4net标记一个名称,这边可以随意。

 

4、在项目中创建一个类用来记录log的日志格式以及数据分类存放

创建LogHelper.cs,

 

定义log格式,当然自己可以随意定义哈。

#region 全局异常错误记录持久化        /// 
        /// 全局异常错误记录持久化        /// 
        /// 
        /// 
        public static void ErrorLog(string throwMsg, Exception ex)
        {            string errorMsg = string.Format("【抛出信息】:{0} 
【异常类型】:{1} 
【异常信息】:{2} 
【堆栈调用】:{3}", new object[] { throwMsg,                 ex.GetType().Name, ex.Message, ex.StackTrace });             errorMsg = errorMsg.Replace("rn", "
");             errorMsg = errorMsg.Replace("位置", "位置");             logerror.Error(errorMsg);         }        #endregion

#region 自定义操作记录        /// 
        /// 自定义操作记录,与仓储中的增删改的日志是记录同一张表        /// 
        /// 
        /// 
        public static void WriteLog(string throwMsg, Exception ex)
        {            string errorMsg = string.Format("【抛出信息】:{0} 
【异常类型】:{1} 
【异常信息】:{2} 
【堆栈调用】:{3}", new object[] { throwMsg,                 ex.GetType().Name, ex.Message, ex.StackTrace });             errorMsg = errorMsg.Replace("rn", "
");             errorMsg = errorMsg.Replace("位置", "位置");             logerror.Error(errorMsg);         }        #endregion

 

 

 5、有了以上的log格式,这样我就开始定义一下全局异常处理吧

我这边先创建一个全局异常处理类 GlobalExceptions.cs 然后需要在startup.cs中注入

在ConfigureServices 方法中注入。

//注入全局异常捕获services.AddMvc(o =>{
o.Filters.Add(typeof(GlobalExceptions));
});

 

 

6、GlobalExceptions类中添加处理,当然异常需要继承IExceptionFilter。

代码如下:

GlobalExceptions

public class GlobalExceptions : IExceptionFilter
    {        private readonly IHostingEnvironment _env;        public GlobalExceptions(IHostingEnvironment env)
        {
            _env = env;
        }        public void onException(ExceptionContext context)
        {            var json = new JsonErrorResponse();            //这里面是自定义的操作记录日志
            if (context.Exception.GetType() == typeof(UserOperationException))
            {
                json.Message = context.Exception.Message;                if (_env.IsDevelopment())
                {
                    json.DevelopmentMessage = context.Exception.StackTrace;//堆栈信息                }
                context.Result = new BadRequestObjectResult(json);//返回异常数据            }            else
            {
                json.Message = "发生了未知内部错误";                if (_env.IsDevelopment())
                {
                    json.DevelopmentMessage = context.Exception.StackTrace;//堆栈信息                }
                context.Result = new InternalServerErrorObjectResult(json);
            }            //采用log4net 进行错误日志记录            LogHelper.ErrorLog(json.Message, context.Exception);

        }
    }    public class InternalServerErrorObjectResult : ObjectResult
    {        public InternalServerErrorObjectResult(object value) : base(value)
        {
            StatusCode = StatusCodes.Status500InternalServerError;
        }
    }

 

JsonErrorResponse.cs 

public class JsonErrorResponse
    {        /// 
        /// 生产环境的消息        /// 
        public string Message { get; set; }        /// 
        /// 开发环境的消息        /// 
        public string DevelopmentMessage { get; set; }
    }

 

UserOperationException.cs

/// 
    /// 操作日志    /// 
    public class UserOperationException : Exception
    {        public UserOperationException() { }        public UserOperationException(string message) : base(message) { }        public UserOperationException(string message, Exception innerException) : base(message, innerException) { }
    }

 

 自此,全局异常配置完成,然后我们可以测试一下,随便写一个除以0的代码在日志记录中就会出现如下的展示:

哇,发现我的错误日志的格式非常的清楚,当然这个跟我的做事态度以及性格有很大的关系的啦,毕竟楼主还是很帅的。哈哈哈。

 

三、NLog使用

 

1、在项目中添加nlog的nuget包引入,“NLog.Web.AspNetCore”

2、创建nlog.config文件,大家会发现我的log格式跟上面的格式操作,而且我的分层层次也很清楚。哈哈.



  
  
    
    

    
    

    
    
  
  
  
    
    
    
    
    
  

 

注:然后将此文件点击右键,选择属性,把复制输出目录修改为“始终复制”,无法不修改,则会无法加载此文件。

 

3、在startup.cs中的  Configure方法注入
//ILoggerFactory loggerFactory
loggerFactory.AddNLog();
NLog.LogManager.LoadConfiguration("nlog.config"); //填入上面创建的文件的名称

 然后运行以下即可看到在bin/debug下面生成文件夹

 

4、创建NLogHelp.cs类

public class NLogHelp
    {        public static Logger logger = LogManager.GetCurrentClassLogger();        public static void ErrorLog(string throwMsg, Exception ex)
        {            string errorMsg = string.Format("【异常信息】:{0} 
【异常类型】:{1} 
【堆栈调用】:{2}",                new object[] { throwMsg, ex.GetType().Name, ex.StackTrace });             errorMsg = errorMsg.Replace("rn", "
");             errorMsg = errorMsg.Replace("位置", "位置");             logger.Error(errorMsg);         }        public static void InfoLog(string operateMsg)         {            string errorMsg = string.Format("【操作信息】:{0} 
",                new object[] { operateMsg });             errorMsg = errorMsg.Replace("rn", "
");             logger.Info(errorMsg);         }     }

 

5、在上面log4net中的GlobalExceptions类把
LogHelper.ErrorLog(json.Message, context.Exception)替换成如下:NLogHelp.ErrorLog(json.Message,context.Exception)即可。

运行测试如下:

【异常时间】:2018/09/03 14:41:36.786 【异常级别】:ERROR 
【异常信息】:错误消息:Failed to create instance of typeat AspectCore.Injector.ServiceCallSiteResolver.ResolvePropertyInject(ServiceDefinition service)【异常类型】:InvalidOperationException 
【堆栈调用】: at AspectCore.Injector.ServiceCallSiteResolver.ResolveTypeService(TypeServiceDefinition typeServiceDefinition)
at AspectCore.Injector.ServiceCallSiteResolver.ResolvePropertyInject(ServiceDefinition service)
at System.Collections.Concurrent.ConcurrentDictionary`2.GetOrAdd(TKey key, Func`2 valueFactory)
at AspectCore.Injector.ServiceResolver.b

 

自此,完美搞定,等后期我将会介绍采用ELK+NLog进行数据采集及展示,请大家拭目以待吧。

原文出处:https://www.cnblogs.com/guolianyu/p/9580626.html

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/230679.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号