在MVC三层项目中如何使用Log4Net

–前期准备(添加到队列中)

0-1在新建后的MVC项目中的【Models】中添加一个类,用于处理异常信息,并继承自HandleErrorAttribute

  public class MyExceptionAttribute: HandleErrorAttribute      {              //创建队列集合          public static Queue<Exception> ExceptionQueue = new Queue<Exception>();              /// <summary>          /// 可以捕获异常数据          /// </summary>          /// <param name="filterContext"></param>          public override void OnException(ExceptionContext filterContext)          {              base.OnException(filterContext);              Exception ex = filterContext.Exception;              //写到队列              //插入到队列里面              ExceptionQueue.Enqueue(ex);              //跳转到错误页面              filterContext.HttpContext.Response.Redirect("/Error.html");          }        }

 

 

0-2在FilterConfig文件中注册自己定义的异常处理过滤器

 

 

 

 

 

 

 

 

1.添加bll文件

 

 

2.在Web.Config中配置Log4Net

 

 

 

 

 

 

 

    <!--Spring.Net配置-->      <sectionGroup name="spring">        <section name="context" type="Spring.Context.Support.MvcContextHandler, Spring.Web.Mvc4" />      </sectionGroup>        <!--log4net配置-->      <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />      </configSections>        <!--Spring.Net配置节点开始-->    <spring>      <context>        <resource uri="file://~/Config/controllers.xml" />        <resource uri="file://~/Config/services.xml" />      </context>    </spring>    <!--Spring.Net配置节点结束-->

<!--log4net配置节点开始-->    <!-- Level的级别,由高到低 -->    <!-- None > Fatal > ERROR > WARN > DEBUG > INFO > ALL-->    <!-- 解释:如果level是ERROR,则在cs文件里面调用log4net的info()方法,则不会写入到日志文件中     type="log4net.Appender.RollingFileAppender":记录到文件    -->    <log4net>      <!-- OFF, FATAL, ERROR, WARN, INFO, DEBUG, ALL -->      <!-- Set root logger level to ERROR and its appenders -->      <root>        <level value="ERROR" />        <appender-ref ref="SysAppender" />      </root>        <!-- Print only messages of level DEBUG or above in the packages -->      <logger name="WebLogger">        <level value="ERROR" />      </logger>      <appender name="SysAppender" type="log4net.Appender.RollingFileAppender,log4net">        <param name="File" value="App_Data/Log/" />        <param name="AppendToFile" value="true" />        <param name="RollingStyle" value="Date" />        <param name="DatePattern" value="yyyy\yyyy-MM\yyyy-MM-dd'.txt'" />        <param name="StaticLogFileName" value="false" />        <layout type="log4net.Layout.PatternLayout,log4net">          <param name="ConversionPattern" value="%newline %n记录时间:%date %n线程ID:[%thread] %n日志级别:  %-5level %n出错类:%logger property: [%property{NDC}] - %n错误描述:%message%newline %n" />        </layout>      </appender>      <appender name="consoleApp" type="log4net.Appender.ConsoleAppender,log4net">        <layout type="log4net.Layout.PatternLayout,log4net">          <param name="ConversionPattern" value="%newline %n记录时间:%date %n线程ID:[%thread] %n日志级别:  %-5level %n出错类:%logger property: [%property{NDC}] - %n错误描述:%message%newline %n" />        </layout>      </appender>    </log4net>    <!--log4net配置节点结束-->

 

 

3.在Global.asax文件中的Application_Start方法中初始化log4net,不要加到页面的Load。

 

 

 

 

4.在Application_Start写以下代码,用来添加到队列

//【开启一个线程,扫描异常信息队列】              //拿到文件夹的物理路径              string filePath = Server.MapPath("/Log/");              //开启线程,使用线程池              ThreadPool.QueueUserWorkItem((a) =>              {                  //线程一直在执行                  while (true)                  {                      //判断队列中有数据,Count>0表示有数据                      if (MyExceptionAttribute.ExceptionQueue.Count > 0)                      {                          //取出数据                          Exception ex = MyExceptionAttribute.ExceptionQueue.Dequeue();                          //判断是否真正拿到数据                          if (ex != null)                          {                              //【将异常信息写到日志文件中】                              //根据年月日 来命名日志文件                              //string fileName = DateTime.Now.ToString("yyyy-MM-dd");                              //File.AppendAllText(filePath + fileName + ".txt", ex.ToString(),System.Text.Encoding.UTF8);                                  //【使用log4net】                              ILog logger = LogManager.GetLogger("errorMsg");                              //将异常信息写入到log4net中                              logger.Error(ex.ToString());                            }                          else                          {                              //如果队列中没有数据,让线程休息3秒钟                              Thread.Sleep(3000);                          }                        }                      else                      {                          //如果队列中没有数据,让线程休息3秒钟                          Thread.Sleep(3000);                      }                  }              }, filePath);          }