MVC使用Log4Net進(jìn)行錯(cuò)誤日志記錄學(xué)習(xí)筆記4
在Web應(yīng)用運(yùn)行過(guò)程中,我們難免會(huì)遇到程序運(yùn)行異常,這個(gè)時(shí)候我們就應(yīng)該將異常信息記錄下來(lái),以便開發(fā)人員和維護(hù)人員對(duì)異常原因進(jìn)行還原,對(duì)異常原因進(jìn)行修復(fù)。在ASP.NET平臺(tái)中進(jìn)行日志記錄的組件也有很多,如Log4Net、CommonLogging等,我們這里選用Log4Net進(jìn)行異常日志的記錄。
1. 捕獲異常
在ASP.NET MVC中提供了一個(gè)全局的異常處理過(guò)濾器:HandleErrorAttribute,可以通過(guò)該過(guò)濾器捕獲異常信息。
我們?cè)贛odels文件夾下新建類型Log4ExceptionAttribute,繼承HandleErrorAttribute類,同時(shí)重寫OnException方法來(lái)捕獲異常數(shù)據(jù):
using System.Web.Mvc; namespace PMS.WebApp.Models { public class Log4ExceptionAttribute:HandleErrorAttribute { /// <summary> /// 重寫OnException方法來(lái)捕獲異常數(shù)據(jù) /// </summary> /// <param name="filterContext"></param> public override void OnException(ExceptionContext filterContext) { base.OnException(filterContext); //捕獲當(dāng)前異常數(shù)據(jù) var ex = filterContext.Exception; } } }
新建過(guò)濾器后我們還需要在Global文件中調(diào)用的RegisterGlobalFilters方法中完成自己定義異常處理過(guò)濾的注冊(cè)。
using System.Web.Mvc; using PMS.WebApp.Models; namespace PMS.WebApp { public class FilterConfig { public static void RegisterGlobalFilters(GlobalFilterCollection filters) { //filters.Add(new HandleErrorAttribute()); filters.Add(new Log4ExceptionAttribute()); } } }
2. 考慮到多用戶并發(fā)操作時(shí)可能產(chǎn)生的問題,我們需要新建一個(gè)隊(duì)列來(lái)進(jìn)行異常信息的暫存,同時(shí)開辟一個(gè)線程專門對(duì)隊(duì)列中的異常信息進(jìn)行處理。
在Log4ExceptionAttribute類中新建一個(gè)靜態(tài)的異常類型的隊(duì)列,在發(fā)生異常后,程序自動(dòng)觸發(fā)OnException方法,方法中將當(dāng)前的異常信息入隊(duì)后,跳轉(zhuǎn)到錯(cuò)誤頁(yè)面。
using System; using System.Collections.Generic; using System.Web.Mvc; namespace PMS.WebApp.Models { public class Log4ExceptionAttribute:HandleErrorAttribute { public static Queue<Exception> Exceptions=new Queue<Exception>(); /// <summary> /// 重寫OnException方法來(lái)捕獲異常數(shù)據(jù) /// </summary> /// <param name="filterContext"></param> public override void OnException(ExceptionContext filterContext) { base.OnException(filterContext); //捕獲當(dāng)前異常數(shù)據(jù) var ex = filterContext.Exception; //將異常數(shù)據(jù)入隊(duì) Exceptions.Enqueue(ex); //跳轉(zhuǎn)到錯(cuò)誤頁(yè)面 filterContext.HttpContext.Response.Redirect("/Error.html"); } } }
Log4Net的配置是在應(yīng)用程序配置文件中進(jìn)行的,我們先在配置文件中進(jìn)行Log4Net的配置。Log4Net需要配置的節(jié)點(diǎn)位置和SpringNet完全相同,首先需要在configSessions中新增子節(jié)點(diǎn),然后在configuration節(jié)點(diǎn)中增加log4net節(jié)點(diǎn)完成具體配置。
<configuration> <configSections> <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /> <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 --> <!--↓Log4Net配置↓--> <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/> <!--↑Log4Net配置↑--> <!--↓Spring.Net配置↓--> <sectionGroup name="spring"> <section name="context" type="Spring.Context.Support.MvcContextHandler, Spring.Web.Mvc4"/> </sectionGroup> <!--↑Spring.Net配置↑--> </configSections> <!--↓Spring.Net配置↓--> <spring> <context> <resource uri="file://~/Config/controllers.xml"/> <resource uri="file://~/Config/services.xml"/> </context> </spring> <!--↑Spring.Net配置↑--> <!--↓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"> <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=""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配置↑--> ... </configuration>
在配置文件中可以對(duì)日志記錄的信息、格式、文件名等作出具體的配置,下面是配置信息的詳解
<?xml version="1.0"?> <configuration> <configSections> <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/> </configSections> <!--站點(diǎn)日志配置部分--> <log4net> <root> <!--控制級(jí)別,由低到高: ALL|DEBUG|INFO|WARN|ERROR|FATAL|OFF--> <!--比如定義級(jí)別為INFO,則INFO級(jí)別向下的級(jí)別,比如DEBUG日志將不會(huì)被記錄--> <!--如果沒有定義LEVEL的值,則缺省為DEBUG--> <level value="ERROR"/> <appender-ref ref="RollingFileAppender"/> </root> <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender"> <!--日志文件名開頭--> <file value="c:\Log\TestLog4net.TXT"/> <!--多線程時(shí)采用最小鎖定--> <lockingModel type="log4net.Appender.FileAppender+MinimalLock"/> <!--日期的格式,每天換一個(gè)文件記錄,如不設(shè)置則永遠(yuǎn)只記錄一天的日志,需設(shè)置--> <datePattern value="(yyyyMMdd)"/> <!--是否追加到文件,默認(rèn)為true,通常無(wú)需設(shè)置--> <appendToFile value="true"/> <!--變換的形式為日期,這種情況下每天只有一個(gè)日志--> <!--此時(shí)MaxSizeRollBackups和maximumFileSize的節(jié)點(diǎn)設(shè)置沒有意義--> <!--<rollingStyle value="Date"/>--> <!--變換的形式為日志大小--> <!--這種情況下MaxSizeRollBackups和maximumFileSize的節(jié)點(diǎn)設(shè)置才有意義--> <RollingStyle value="Size"/> <!--每天記錄的日志文件個(gè)數(shù),與maximumFileSize配合使用--> <MaxSizeRollBackups value="10"/> <!--每個(gè)日志文件的最大大小--> <!--可用的單位:KB|MB|GB--> <!--不要使用小數(shù),否則會(huì)一直寫入當(dāng)前日志--> <maximumFileSize value="2MB"/> <!--日志格式--> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%date [%t]%-5p %c - %m%n"/> </layout> </appender> </log4net> </configuration>
在Global文件中的Application_Start方法中開啟一個(gè)線程,用于將隊(duì)列中的錯(cuò)誤信息寫入日志文件。
using System.Linq; using System.Threading; using System.Web.Http; using System.Web.Mvc; using System.Web.Optimization; using System.Web.Routing; using log4net; using PMS.WebApp.Models; using Spring.Web.Mvc; namespace PMS.WebApp { // 注意: 有關(guān)啟用 IIS6 或 IIS7 經(jīng)典模式的說(shuō)明, // 請(qǐng)?jiān)L問 http://go.microsoft.com/?LinkId=9394801 public class MvcApplication : SpringMvcApplication//HttpApplication { protected void Application_Start() { log4net.Config.XmlConfigurator.Configure();//讀取Log4Net配置信息 AreaRegistration.RegisterAllAreas(); WebApiConfig.Register(GlobalConfiguration.Configuration); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); RouteConfig.RegisterRoutes(RouteTable.Routes); BundleConfig.RegisterBundles(BundleTable.Bundles); //開啟一個(gè)線程,掃描異常信息隊(duì)列. var filePath = Server.MapPath("/Log/"); ThreadPool.QueueUserWorkItem((a) => { while (true) { //判斷隊(duì)列中是否有數(shù)據(jù) if (Log4ExceptionAttribute.Exceptions.Any()) { //出隊(duì)一條異常信息 var ex = Log4ExceptionAttribute.Exceptions.Dequeue(); //若異常信息不為空 if (ex == null) continue; //將異常信息寫入到日志文件中 var logger = LogManager.GetLogger("errorMsg"); logger.Error(ex.ToString()); } else { //若異常信息隊(duì)列為空,則線程休息三秒 Thread.Sleep(3000); } } }, filePath); } } }
成功完成錯(cuò)誤日志的配置。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
詳解ASP.NET Core 之 Identity 入門(二)
本篇文章主要介紹了ASP.NET Core 之 Identity 入門,主要負(fù)責(zé)對(duì)用戶的身份進(jìn)行認(rèn)證,有興趣的可以了解一下。2016-12-12asp.net BOF或EOF有一個(gè)是真,或者當(dāng)前記錄已被刪除
在調(diào)試“學(xué)生管理系統(tǒng)”時(shí),想修改學(xué)籍信息,如果此時(shí)數(shù)據(jù)庫(kù)中的數(shù)據(jù)已被完全刪除則會(huì)出現(xiàn)“BoF 或Eof有一個(gè)是真,或當(dāng)前記錄已被刪除的錯(cuò)誤2009-07-07使用asp.net MVC4中的Bundle遇到的問題及解決辦法分享
這篇文章主要介紹了使用asp.net MVC4中的Bundle遇到的問題及解決辦法,需要的朋友可以參考下2014-02-02Asp.net "對(duì)路徑的訪問被拒絕" 解決方法的分析
本篇文章是對(duì)Asp.net中"對(duì)路徑的訪問被拒絕" 的解決方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05ASP.NET中內(nèi)嵌頁(yè)面代碼的一個(gè)問題
如果頁(yè)面繼承了一個(gè)父頁(yè)面,而且當(dāng)前頁(yè)面用new覆蓋了父頁(yè)面的某個(gè)屬性2010-02-02.NET醫(yī)院公眾號(hào)系統(tǒng)線程CPU雙高問題分析
這篇文章主要介紹了.NET醫(yī)院公眾號(hào)系統(tǒng) 線程CPU雙高分析,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-04-04