• 在ASP.NET MVC中使用Log4Net记录异常日志,出错时导向到静态页


    本篇体验在ASP.NET MVC 4中使用Log4Net记录日志。

    通过NuGet安装Log4Net。

    1

    需求是:当出错时导向到Error.html静态页面,Log4Net记录错误信息。

    大致的思路是:

    1、写一个记录日志的接口
    2、实现记录日志接口的类,用Log4Net的API实现
    3、在Web.config中配置Log4Net
    4、在Global.asax中注册Log4Net
    5、自定义一个出错页,以便在出错时导向到该静态页面
    6、ASP.NET MVC默认的异常过滤器是HandleErrorAttribute,我们需要自定义一个继承HandleErrorAttribute的过滤器,并把自定义的过滤器注册到全局过滤器中去

    首先定义一个记录日志的接口。

        public interface ILoggerService
    
        {
    
            void Info(string message);
    
            void Warn(string message);
    
            void Debug(string message);
    
            void Error(string message);
    
            void Error(Exception ex);
    
            void Fatal(string message);
    
            void Fatal(Exception ex); 
    
        }

    实现ILoggerService,使用用Log4Net的API实现。

        public class LogHelper : ILoggerService
    
        {
    
             private ILog _logger;
    
             public LogHelper()
    
             {
    
                _logger = LogManager.GetLogger(
    
                    System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
    
            }
    
            
    
            public void Info(string message) {
    
                _logger.Info(message);
    
            }
    
            public void Warn(string message) {
    
                _logger.Warn(message);
    
            }
    
            public void Debug(string message) {
    
                _logger.Debug(message);
    
            }
    
            public void Error(string message) {
    
                _logger.Error(message);
    
            }
    
            public void Error(Exception ex) {
    
                _logger.Error(ex.Message, ex);
    
            }
    
            public void Fatal(string message) {
    
                _logger.Fatal(message);
    
            }
    
            public void Fatal(Exception ex) {
    
                _logger.Fatal(ex.Message, ex);
    
            }
    
        }
    

    在Web.config中配置Log4Net。

    <configuration>
    
      <configSections>
    
        ......
    
        <!--日志的配置-->
    
        <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4Net" />
    
      </configSections>
    
       ......
    
      <!--日志的配置开始-->
    
      <log4net>
    
        <root>
    
          <level value="ALL" />
    
          <appender-ref ref="SysAppender" />
    
        </root>
    
        <logger name="WebLogger">
    
          <!--配置日志的级别,低于此级别的就不写到日志里面去-->
    
          <level value="DEBUG" />
    
        </logger>
    
        <!--系统日志的格式-->
    
        <appender name="SysAppender" type="log4net.Appender.RollingFileAppender,log4net">
    
          <param name="File" value="App_Data/" />
    
          <param name="AppendToFile" value="true" />
    
          <param name="RollingStyle" value="Date" />
    
          <param name="DatePattern" value="&quot;Logs_&quot;yyyyMMdd&quot;.txt&quot;" />
    
          <param name="StaticLogFileName" value="false" />
    
          <layout type="log4net.Layout.PatternLayout,log4net">
    
            <!--<param name="ConversionPattern" value="%d [%t] %-5p %c - %m%n" />-->      
    
            <conversionPattern value="{%level}%date{MM/dd HH:mm:ss} - %message%newline%newline"/>
    
          </layout>
    
        </appender>
    
        <!--控制台日志的格式-->
    
        <appender name="consoleApp" type="log4net.Appender.ConsoleAppender,log4net">     
    
          <layout type="log4net.Layout.PatternLayout,log4net">
    
            <param name="ConversionPattern" value="%d [%t] %-5p %c - %m%n" />
    
          </layout>
    
        </appender>
    
      </log4net>
    
      <!--日志的配置结束-->
    
    </configuration>     
    

      

    在全局文件Global.asax中注册Log4Net。

        public class MvcApplication : System.Web.HttpApplication
    
        {
    
            protected void Application_Start()
    
            {
    
                AreaRegistration.RegisterAllAreas();
    
                ......
    
                //读取日志  如果使用log4net,应用程序一开始的时候,都要进行初始化配置
    
                log4net.Config.XmlConfigurator.Configure();
    
            }
    
        }
    

    ASP.NET MVC默认的异常过滤器是HandleErrorAttribute,我们需要自定义,继承该类。

        public class MyHandleExceptionAttribute : HandleErrorAttribute
    
        {
    
            public override void OnException(ExceptionContext filterContext)
    
            {
    
                base.OnException(filterContext);
    
                var log  = new LogHelper();
    
                log.Error("被系统过滤捕获的异常" + filterContext.Exception);
    
                filterContext.HttpContext.Response.Redirect("/Error.html");
    
            }
    
        }
    

    自定义的异常过滤器当让要注册到全局过滤器中去。打开App_Start文件夹中的FilterConfig类,修改如下:

        public class FilterConfig
    
        {
    
            public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    
            {
    
                //filters.Add(new HandleErrorAttribute());
    
                filters.Add(new MyHandleExceptionAttribute());
    
            }
    
        }

    在HomeController中故意留一个错误。

        public class HomeController : Controller
    
        {
    
            public ActionResult Index()
    
            {
    
                int a = 10;
    
                int b = 0;
    
                var result = a/b;
    
                return View();
    
            }
    
        }

    在项目根文件夹下顶一个Error.html静态文件,用来呈现错误提示信息。   

    当浏览器请求Home/Index视图,导向到Error.html出错页,Log4Net自动为我们在App_Data目录下记录了异常信息。           

  • 相关阅读:
    maria-developers 开发者邮件
    Parallel Programming--perfbook
    面向对象设计模式中类与类关系
    binlog 轻松的找到没有及时提交的事物(infobin工具
    deeplearningbook-chinese
    Introduction to the Optimizer --cbo
    dell T420热插拔安装过程
    MySQL是如何利用索引的
    BTrace housemd TProfiler
    杨建荣的学习笔记
  • 原文地址:https://www.cnblogs.com/darrenji/p/4367623.html
Copyright © 2020-2023  润新知