對於網站來講,我們不能將異常信息顯示給用戶, Log4Net用來記錄日志,可以將程序運行過程中的信息輸出到文件,數據庫中等地方,可以通過日志查看系統的運行過程,發現系統的問題。log4net的使用步驟如下:
1.添加對log4net.dll的引用。
2.在配置文件中添加配置。如下是在web.config的配置:
在configSections下節點配置為:
<!--日志的配置--> <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4Net"/>
配置為:
<!--日志的配置開始--> <log4net> <root> <level value="ALL"/> <appender-ref ref="SysAppender"/> </root> <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> <!--日志的配置結束-->
Appender:可以將日志輸出到不同的地方,不同的輸出目標對應不同的Appender:RollingFileAppender(滾動文件),
AdoNetAppender(數據庫), SmtpAppender (郵件)等。
level(級別):標識這條日志信息的重要級別。None>Fatal>ERROR>WARN>DEBUG>INFO>ALL,設定一個Level,那么低於
這個 Level的日志是不會被寫到Appender中的。
3.在程序一開始的時候,我們需要在Global.asax.cs文件中的Application_Start事件中進行一下初始化配置。
protected void Application_Start() { AreaRegistration.RegisterAllAreas(); // 默認情況下對 Entity Framework 使用 LocalDB Database.DefaultConnectionFactory = new SqlConnectionFactory(@"Data Source=(localdb)\v11.0; Integrated Security=True; MultipleActiveResultSets=True"); RegisterGlobalFilters(GlobalFilters.Filters); RegisterRoutes(RouteTable.Routes); //讀取日志 如果使用log4net,應用程序一開始的時候,都要進行初始化配置 log4net.Config.XmlConfigurator.Configure(); }
4.我們可以寫一個類,定義一個靜態方法,這個方法將可以將我們的錯誤消息進行輸出。因為不僅僅一個地方需要,所以我們把它定義為了靜態方法。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Common.Logging; namespace HWH.OADemo.Common { public class LogHelper { public static void WriteLog(string txt) { ILog log = LogManager.GetLogger("log4netlogger"); log.Error(txt); } } }
5.MVC為我們提供了一種全局過濾機制,其中有一種過濾器叫做異常過濾器,當項目中出現異常的時候執行異常處理器中的代碼。
為了做到不修改源代碼,我們可以自定義一個類,使這個類繼承自HandleErrorAttribute這個類,並重寫其內部方法。這個方法內部代碼的作用
就是處理異常,將異常信息記錄日志,讓當前請求跳轉到錯誤頁面。
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; namespace HWH.OADemo.UI.Models { public class MyExceptionFileAttribute:HandleErrorAttribute { public override void OnException(ExceptionContext filterContext) { base.OnException(filterContext); //處理錯誤消息,將其跳轉到一個頁面 Common.LogHelper.WriteLog(filterContext.Exception.ToString()); //頁面跳轉到錯誤頁面 filterContext.HttpContext.Response.Redirect("/Error.html"); } } }
6.由於全局都需要進行異常的處理,我們需要在Global.asax的RegisterGlobalFilters方法中注冊我們自己的異常處理過濾器。
public static void RegisterGlobalFilters(GlobalFilterCollection filters) { filters.Add(new MyExceptionFileAttribute()); }
操作完畢,在項目出現異常的時候,我們就很清楚的查看錯誤信息了。