Log4Net 是用來記錄日誌的,能夠將程序運行過程當中的信息輸出到一些地方(文件、數據庫、EventLog等)。日誌就是程序的「黑匣子」,能夠經過日誌查看系統的運行過程,從而發現系統的問題。html
日誌的做用就是將運行過程的步驟、成功失敗記錄下來,將關鍵性的數據記錄下來分析系統問題所在。web
對於Web應用來講,不能把異常信息顯示給用戶,異常信息只能記錄到日誌,出了問題把日誌文件發給開發人員就能知道問題所在。數據庫
Log4Net 的配置步驟以下:安全
1. 引用 log4net.dll多線程
新建項目,經過NuGet在項目中添加對log4net的引用。併發
2. 配置app
在web.config (或app.config)中添加配置。框架
在<configSection>中添加以下配置節點ide
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>佈局 |
緊靠</configSections> 後,添加以下配置信息:
<log4net> <root> <level value="ALL"/> <appender-ref ref="SysAppender"/> </root> <logger name="WebLogger"> <!--這裏進一步限制了日誌級別,只有在大於等於DEBUG狀況下才會記錄日誌--> <level value="DEBUG"/> </logger> <!--指定日誌記錄的方式:以滾動文件的方式--> <appender name="SysAppender" type="log4net.Appender.RollingFileAppender, log4net"> <!--指定日誌存放的路徑,這裏放置到App_Data目錄是爲了安全--> <param name="File" value="App_Data/Log/"/> <!--日誌以追加的形式記錄--> <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> |
3.初始化
在程序最開始加入 log4net.Config.XmlConfigurator.Configure();(在Global.asax文件的Application_Start()方法中。
4. 記錄日誌
在要打印日誌的地方LogManager.GetLogger(typeof(Program)).Debug(「信息」);。經過LogManager.GetLogger傳遞要記錄的日誌類類名得到這個類的ILog(這樣在日誌文件中就能看到這條日誌是哪一個類輸出的了),而後調用Debug方法輸出消息。由於一個類內部不止一個地方要打印日誌,因此通常把ILog聲明爲一個static字段。
Private static ILog logger=LogManager.GetLogger(typeof(Test))
輸出錯誤信息用ILog.Error方法,第二個參數能夠傳遞Exception對象。 如log.Error("***錯誤"+ex)、log.Error("***錯誤",ex)。
考慮到記錄日誌會存在併發問題,這裏經過隊列的方式記錄日誌。
思路:把全部產生的日誌信息存放到一個隊列裏,而後經過新建一個線程不斷的從這個隊列裏面讀取異常信息,而後往日誌裏面寫。這也算是所謂的生產者-消費者模式。
5. 自定義異常過濾器
新建一個類 MyExceptionAttribute,繼承自全局異常類HandleErrorAttribute。代碼以下所示。
public class MyExceptionAttribute : HandleErrorAttribute { // 此處的隊列對象必須是靜態的(全局的) public static Queue<Exception> ExecptionQueue = new Queue<Exception>(); /// <summary> /// 能夠捕獲異常數據 /// </summary> /// <param name="filterContext"></param> public override void OnException(ExceptionContext filterContext) { base.OnException(filterContext); Exception ex = filterContext.Exception; //寫到隊列 ExecptionQueue.Enqueue(ex); //跳轉到錯誤頁面. filterContext.HttpContext.Response.Redirect("/Error.html"); } } |
6. 修改FileConfig
修改醒目 App_Start文件夾中的FileConfig.cs文件,調用MyExceptionAttribute。
public class FilterConfig { public static void RegisterGlobalFilters(GlobalFilterCollection filters) { //filters.Add(new HandleErrorAttribute()); //註釋掉系統默認 filters.Add(new MyExceptionAttribute()); } } |
7. 多線程記錄日誌
在Global.asax 文件中的Application_Start()方法中添加以下代碼。
protected void Application_Start() { log4net.Config.XmlConfigurator.Configure();//讀取Log4Net配置信息
AreaRegistration.RegisterAllAreas(); RouteConfig.RegisterRoutes(RouteTable.Routes); RecordLog(); } //記錄日誌 void RecordLog() { ThreadPool.QueueUserWorkItem((a) => { while (true) { //若是異常隊列中有數據 if (MyExceptionAttribute.ExecptionQueue.Count > 0) { //從隊列中讀取異常信息 Exception ex = MyExceptionAttribute.ExecptionQueue.Dequeue() ; ILog logger = LogManager.GetLogger("errorMsg"); logger.Error(ex.ToString()); //將異常寫入Log4Net } else { //若是隊列中沒有數據,休息避免形成CPU的佔用. Thread.Sleep(3000); } } }); } |
至此,Log4Net的配置所有完成,當系統出現異常時,項目根目錄下的App_Data文件夾中會出現一個txt的日誌文件 Logs_********.txt ,這個日誌文件的名稱是根據咱們在配置文件中的規則生成的。
Log4Net 有3個主要組件: loggers,appenders 和 layouts。這3個組件一塊兒工做使得開發者可以根據信息類型和等級(Level)記錄信息,以及在運行時控制信息的格式化和信息的寫入位置(如控制檯、文件、內存、數據庫等)。過濾器幫助這些組件控制追加器(appender)的行爲和把對象轉換成字符串的對象渲染。
日誌框架除了Log4Net,還有Enterprise Library中的Logging Application Block、Apache的CommonLog 以及NLog等,都差很少。