你的位置:首页 > ASP.net教程

[ASP.net教程]在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.
    }
  }

 

 

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目录下记录了异常信息。