在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);          }