對於網站來講,我們不能將異常信息顯示給用戶, 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()); }
操作完畢,在項目出現異常的時候,我們就很清楚的查看錯誤信息了。
