第三节:使用Log4net和过滤器记录异常信息,返回异常给前端

上次面试,遇到,在项目中如何处理业务异常和代码异常,使用txt记录异常信息后,如何直接区分出异常的类型,异常怎么分类处理,希望大家能帮我提出宝贵的意见,完善处理异常,

统一返回参数

    public class HeaderResult
    {
        public HeaderResult()
        {
            // ReSharper disable once VirtualMemberCallInConstructor
            IsSucceed = false;
        }

        public virtual bool IsSucceed { get; set; }

        public virtual string Message { get; set; }

        public virtual T Result { get; set; }

        public virtual string StatusCode { get; set; }
    }
    

创建一个过滤器

在过滤器中拦截异常信息,使用Log4net 记录日志到txt中,获取到异常信息统一返回给前端

    public class ProjectExceptionFilter : IExceptionFilter
 {
    public void OnException(ExceptionContext context)
    {
       Exception exception = context.Exception;
        var exceptionType = exception.GetType().ToString();
        if (exceptionType == "ProjectCore.Common.DomainException")
        {
            //用来分类处理业务逻辑
        }
        //获取controller的名称
        var controller = context.RouteData.Values["controller"].ToString();
        //获取Action的名称
        var action = context.RouteData.Values["Action"].ToString();
        var errorPath = controller + "/" + action;
        LogHelper.LogError("web service error:" + errorPath, exception);
        //返回异常信息给前端
        context.Result = new JsonResult(new HeaderResult<string>
        {
            Message = "错误路径:" + errorPath + ":错误信息" + exception.Message+"",
            IsSucceed = false
        });
        //异常已处理了
        context.ExceptionHandled = true;
    }
}
</pre>

使用Log4net 记录日志到txt中 log4net.config网上有许多,这里就不贴出来了

    public static class LogHelper
{
    private static ILog _logger;

    static LogHelper()
    {
        ILoggerRepository repository = LogManager.CreateRepository("NETCoreRepository");
        XmlConfigurator.Configure(repository, new FileInfo("log4net.config"));
        LogHelper._logger = LogManager.GetLogger(repository.Name, "NETCorelog4net");
    }
    public static void LogError(string msg, Exception ex)
    {
        string errorMsg = string.Format("【抛出信息】:{0} <br/>【异常类型】:{1} <br/>【异常信息】:{2} <br/>【堆栈调用】:{3}", new object[] { msg,
        ex.GetType().Name, ex.Message, ex.StackTrace });
        errorMsg = errorMsg.Replace("\r\n", "<br>");
        errorMsg = errorMsg.Replace("位置", "<strong style=\"color:red\">位置</strong>");
        LogHelper._logger.Error(errorMsg);
    }
    public static void LogInfo(string msg)
    {
        LogHelper._logger.Info((object)msg);
    }
    public static void LogDebug(string msg)
    {
        LogHelper._logger.Debug((object)msg);
    }
}
</pre>

在Startup 下面配置

       services.AddMvc(options =>
        {

            options.Filters.Add(typeof(ProjectExceptionFilter));
            options.Filters.Add(typeof(ModelVerificationFilter));
        }).
           SetCompatibilityVersion(CompatibilityVersion.Version_2_1).
            AddJsonOptions(options =>
            {
                //忽略循环引用
                options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
                //不使用驼峰样式的key
                options.SerializerSettings.ContractResolver = new DefaultContractResolver();
                //设置时间格式
                options.SerializerSettings.DateFormatString = "yyyy-MM-dd";
            });
</pre>

原文地址:https://www.cnblogs.com/lifeng618/p/9630570.html

时间: 2024-07-30 16:27:28

第三节:使用Log4net和过滤器记录异常信息,返回异常给前端的相关文章

Spring MVC异常统一处理(异常信息的国际化,日志记录)

JAVA EE项目中,不管是对底层的数据操作,还是业务层的处理过程,还是控制层的处理,都不可避免的会遇到各种可预知的(业务异常主动抛出).不可预知的异常需要处理.一般dao层.service层的异常都会直接抛出,最后由controller统一进行处理,每个过程都单独处理异常,且要考虑到异常信息和前端的反馈,代码的耦合度高,不统一,后期维护的工作也多. 同时还必须考虑异常模块和日志模块.国际化的支持. 因此需要一种异常处理机制将异常处理解耦出来,这样保证相关处理过程的功能单一,和系统其它模块解耦,

Xamarin.Android-捕获未处理异常(全局异常)

一.前言 android中如果出现了未处理的异常,程序会闪退,这是非常不好的用户体验,很多用户会因此卸载APP,因此未处理的异常是应该尽力避免的. 有些很难避免的异常(如:IO.网络等),应在代码中进行捕捉并做相应的处理,以阻止程序崩溃闪退. 但是“没有任何程序是完美的”,况且各式各样的android终端也大大增加了异常的出现概率,就连强大的QQ.微信等不也会闪退嘛! 这时就需要全局捕获未处理的异常,并进行处理.(注意:本文中的处理方式并不能阻止APP闪退) 处理方式:收集异常信息.当前场景[时

python中利用tracekback跟踪栈以及打印异常信息

?##sys.exc_info() 返回 (type, value, traceback). type为异常类型, value为异常的参数(通常为异常错误的信息), traceback为跟踪回溯的对象. exc_type, exc_value, exc_traceback = sys.exc_info() print "*** print sys.exc_info:" print 'exc_type is: %s, exc_value is: %s, exc_traceback is:

.Net Core中间件和过滤器实现错误日志记录

1.中间件的概念 ASP.NET Core的处理流程是一个管道,中间件是组装到应用程序管道中用来处理请求和响应的组件. 每个中间件可以: 选择是否将请求传递给管道中的下一个组件. 可以在调用管道中的下一个组件之前和之后执行业务逻辑. 中间件是一个请求委托( public delegate Task RequestDelegate(HttpContext context) )的实例,所以中间件的本质就是一个方法,方法的参数是HttpContext,返回Task.传入的HttpContext参数包含

Log4Net在MVC下的配置以及运用线程队列记录异常信息

Log4Net是用来记录日志的,可以将程序运行过程中的信息输出到一些地方(文件.数据库.EventLog等),日志就是程序的黑匣子,可以通过日志查看系统的运行过程,从而发现系统的问题.日志的作用:将运行过程的步骤.成功失败记录下来,将关键性的数据记录下来分析系统问题所在.Log4J.对于网站来讲,不能把异常信息显示给用户,异常信息只能记录到日志,出了问题把日志文件发给开发人员,就能知道问题所在. 配置Log4Net环境 (1)新建一个WebApplication (2)添加对log4net.dl

J2EE监听器和过滤器基础

Servlet程序由Servlet,Filter和Listener组成,其中监听器用来监听Servlet容器上下文. 监听器通常分三类:基于Servlet上下文的ServletContex监听,基于会话的HttpSession监听和基于请求的ServletRequest监听. ServletContex监听器 ServletContex又叫application,存在范围是整个Servlet容器生命周期,当系统启动时就会创建,系统关闭时会销毁,该对象通常存放一些非常通用的数据,但是不推荐存放太多

CSS招数和过滤器

在理想环境中,编写正确的CSS会在支持CSS的浏览器中正常的工作.不幸的事,我们并不是生活在理想环境中,浏览器有不少bug和不一致的地方.为了创建能在各种浏览器上显示相同样式的页面,CSS开发人员需要发挥创造性.通过利用bug和未实现的CSS,开发人员能够选择性的对不同的浏览器应用不同的规则.招数和过滤器是开发人员强大的工具.但是,正是因为强大,使用的时候才更应该谨慎.了解各种常用招数和它们的实现原理确实很重要,但是,了解在什么时候使用它们和什么时候不使用它们也同样重要. 过滤单独的样式表 将招

第一篇博客关于Log4net的配置记录

说明:本程序演示如何利用log4net记录程序日志信息.log4net是一个功能著名的开源日志记录组件.利用log4net可以方便地将日志信息记录到文件.控制台.Windows事件日志和数据库(包括MS SQL Server, Access, Oracle9i,Oracle8i,DB2,SQLite)中.并且我们还可以记载控制要记载的日志级别,可以记载的日志类别包括:FATAL(致命错误).ERROR(一般错误).WARN(警告).INFO(一般信息).DEBUG(调试信息).要想获取最新版本的

django “如何”系列4:如何编写自定义模板标签和过滤器

django的模板系统自带了一系列的内建标签和过滤器,一般情况下可以满足你的要求,如果觉得需更精准的模板标签或者过滤器,你可以自己编写模板标签和过滤器,然后使用{% load %}标签使用他们. 代码布局 自定义标签和过滤器必须依赖于一个django app,也就是说,自定义标签和过滤器是绑定app的.该app应该包含一个templatetags目录,这个目录一个和model.py,views.py在同一个层级,记得在该目录下建立一个__init__.py文件一遍django知道这是一个pyth