學習MVC不久,看到公司的項目里有日志記錄功能,出于自己的原因一直沒有看看是如何實現的,后來看了個學習視頻和一些博文,才發(fā)現采用MVC里的過濾器 Filter 可以很容易實現,比較常見也很容易的做法就是繼承 IActionFilter,IExceptionFilter 接口,然后實現里面的方法即可。
讓客戶滿意是我們工作的目標,不斷超越客戶的期望值來自于我們對這個行業(yè)的熱愛。我們立志把好的技術通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領域值得信任、有價值的長期合作伙伴,公司提供的服務項目有:域名申請、雅安服務器托管、營銷軟件、網站建設、欒川網站維護、網站推廣。下面看一下代碼,這是公司項目的一段代碼,主要是將項目中出現的異常記錄在 每天的txt日志文件里。當然實現日志的方法有很多種,這個只是其中一種,如果出現了IO錯誤,這種方法就不好說啦。
public class AppHandleErrorAttribute : FilterAttribute, IExceptionFilter { public void OnException(ExceptionContext filterContext) { //System.Web.Mvc.ExceptionContext if (!filterContext.ExceptionHandled ) { //如果已經自己寫了try catch,那么可不用記錄日志 var ds = (System.Web.Configuration.CompilationSection)System.Configuration.ConfigurationManager.GetSection("system.web/compilation"); if (ds.Debug) { //創(chuàng)建相關文件,并寫入異常記錄 var dir = System.Web.HttpContext.Current.Server.MapPath("~") + @"\log\"; if (!System.IO.Directory.Exists(dir)) { System.IO.Directory.CreateDirectory(dir); } var path = dir + DateTime.Now.ToString("yyyyMMdd") + "_site.txt"; using (System.IO.StreamWriter sw = new System.IO.StreamWriter(path, true)) { var dataException = filterContext.Exception; var message = dataException.Message; sw.WriteLine(); sw.WriteLine("-----------------"+DateTime.Now.ToString("HH:mm:ss") + "-----------------"); sw.WriteLine(message); sw.WriteLine("Message:" + dataException.Message); sw.WriteLine("StackTrace:" + dataException.StackTrace.ToString()); sw.Flush(); sw.Close(); } } filterContext.ExceptionHandled = true;//異常已經處理,程序可以不用在處理一遍 //var link = new UrlHelper(filterContext.RequestContext).Action("Index", "CustomError"); //filterContext.Result = new RedirectResult(link); //filterContext.Result = new ContentResult() { Content = "網絡連接異常,請刷新重試", ContentType = "text/html" }; filterContext.Result = new ContentResult() { Content = " 當前網絡發(fā)生故障,請刷新頁面重試(點擊刷新)", ContentType = "text/html" }; } } }
上邊這段代碼很簡單,如果只是單純記錄某一個Action的Exception,那么調用方法如下
[AppHandleError] public ActionResult xxAction() { return View(); }
如果是全局的設置,那么就要在項目的Global.ascx 里面加上這么一段話,注冊 自定義的Filter
public static void RegisterGlobalFilters(GlobalFilterCollection filters) { filters.Add(new AppHandleErrorAttribute()); } protected void Application_Start() { // AreaRegistration.RegisterAllAreas(); // 調用注冊方法 RegisterGlobalFilters(GlobalFilters.Filters); // RegisterRoutes(RouteTable.Routes); }
下面進入實戰(zhàn)Demo
1.編寫AppHandleErrorAttribute,代碼已經貼出
2.在需要記錄異常的Action上添加這個屬性
[AppHandleError] public ActionResult Index() { throw new Exception("記錄日志的內容"); return View(); }
先看一下沒加 這個過濾器的頁面,很明顯黃頁:
下面是添加過濾器的運行效果:
那么這個頁面就是錯誤處理頁了,我這里是輸出的內容,也可以將filterContext.Result 設置成為ViewResult,或者跳轉到新的錯誤頁面。再看一下日志記錄:
可以看到,異常日志已經添加到相關的txt日志文件里面。
說明:如果在Global里面增加了項目配置,那么在Action上就不用標注這個過濾器,所有未經過Try catch的異常都可以捕獲處理,代碼,圖略。
所以,try catch不是什么情況下都適用,如果不影響重要業(yè)務的情況下,可以使用try catch來處理業(yè)務,如果是比較重大的錯誤,就需要日志記錄了。今天就到這里吧,第一次寫這種博文,也算是自己的學習感想。有不足或者更好的方法歡迎批評指出。
另外有需要云服務器可以了解下創(chuàng)新互聯scvps.cn,海內外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。