ASP.NET MVC 使用Log4Net记录系统运行中问题
log4net是.Net下一個非常優秀的開源日志記錄組件。log4net記錄日志的功能非常強大。它可以將日志分不同的等級,以不同的格式,輸出到不同的媒介。
在NuGet程序包中下載log4Net組件,如下圖所示:?
?
打開Web.config文件,在<configSections>中添加如下配置節點:
<configSections><section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/></configSections>?緊靠上圖節點,添加如下配置節點:
<!--log4Net的另一種配置:動態配置--><log4net><!-- OFF, FATAL, ERROR, WARN, INFO, DEBUG, ALL --><!-- Set root logger level to ERROR and its appenders --><root><level value="ALL"/><appender-ref ref="SysAppender"/></root><!-- Print only messages of level DEBUG or above in the packages --><logger name="WebLogger"><!--這里進一步限制了日志級別,只有在大于等于DEBUG的情況下才會記錄日志--><level value="DEBUG"/></logger><appender name="SysAppender" type="log4net.Appender.RollingFileAppender,log4net" ><!--日志放在項目的App_Data文件夾--><param name="File" value="App_Data/" /><!--日志以追加形式記錄--><param name="AppendToFile" value="true" /><!--日期作為回滾:日期排序--><param name="RollingStyle" value="Date" /><!--設置日志文件名稱的生成規則 --><param name="DatePattern" value=""Logs_"yyyyMMdd".txt"" /><!--日志文件是否靜態:否--><param name="StaticLogFileName" value="false" /><!--日志格式的內容和布局--><layout type="log4net.Layout.PatternLayout,log4net"><param name="ConversionPattern" value="%d [%t] %-5p %c - %m%n" /><param name="Header" value=" ----------------------header-------------------------- " /><param name="Footer" value=" ----------------------footer-------------------------- " /></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><!--Log4Net配置結束-->注意: <configSections> 必須是 <configuration>元素下第一個子元素,并且是唯一的。不然會報錯,報錯界面如下所示:
?
?
在Global.asax.cs文件中的Application_Start方法中,插入如下代碼:?
log4net.Config.XmlConfigurator.Configure();考慮到記錄日志會存在并發的問題,這里通過隊列的方式來記錄日志:把所有產生的日志信息存放到一個隊列里,然后通過新建一個線程不斷的從這個隊列里讀取異常信息,然后往日志里寫,這也就是所謂的生產者--消費者模式。?
新建一個類MyErrorAttribute?,繼承自全局異常類HandleErrorAttribute,,如下圖所示:
public class MyErrorAttribute:HandleErrorAttribute{public static Queue<Exception> ExceptionQueue = new Queue<Exception>();public override void OnException(ExceptionContext filterContext){ExceptionQueue.Enqueue(filterContext.Exception);base.OnException(filterContext);}}?在FilterConfig類中替換成 上圖 自定義的 類:
public static void RegisterGlobalFilters(GlobalFilterCollection filters){//filters.Add(new HandleErrorAttribute());//注釋掉系統默認的filters.Add(new MyErrorAttribute());}在Global.asax.cs文件中的Application_Start方法中,再插入如下代碼:
ThreadPool.QueueUserWorkItem(o =>{while (true){if (MyErrorAttribute.ExceptionQueue.Count > 0){Exception ex = MyErrorAttribute.ExceptionQueue.Dequeue();if (ex != null){log4net.ILog logger = log4net.LogManager.GetLogger("testError");logger.Error(ex.ToString());//將異常寫入log4net}else{Thread.Sleep(50);}}else{Thread.Sleep(50);}}});此時,?Global.asax.cs文件中的Application_Start方法已經變成如下圖所示的樣子了:
protected void Application_Start(){log4net.Config.XmlConfigurator.Configure();AreaRegistration.RegisterAllAreas();FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);RouteConfig.RegisterRoutes(RouteTable.Routes);BundleConfig.RegisterBundles(BundleTable.Bundles);ThreadPool.QueueUserWorkItem(o =>{while (true){if (MyErrorAttribute.ExceptionQueue.Count > 0){Exception ex = MyErrorAttribute.ExceptionQueue.Dequeue();if (ex != null){log4net.ILog logger = log4net.LogManager.GetLogger("testError");logger.Error(ex.ToString());//將異常寫入log4net}else{Thread.Sleep(50);}}else{Thread.Sleep(50);}}});}?
接下去開始測試:在控制器中添加一段引發異常的代碼,如下圖所示:?
public ActionResult About(){int result = 0;int x = 1, y = 0;result = x / y; //引發異常ViewBag.Message = "Your application description page.";return View();}運行,系統跳轉到error界面,如下圖所示:
?
打開App_Data文件,查看日志文件如下所示:?
?
至此為止,一個利用Log4Net記錄系統異常的功能開發完成了。?
?
?
?
?
?
?
總結
以上是生活随笔為你收集整理的ASP.NET MVC 使用Log4Net记录系统运行中问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Cannot resolve jakar
- 下一篇: latex目录标题中间空一个字符