在MVC三層項目中如何使用Log4Net
- 2020 年 4 月 5 日
- 筆記
–前期準備(添加到隊列中)
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); }