在開發項目的過程中,我們會遇到各種各樣的錯誤,那么接下來就說一下普通記錄錯誤日志的功能。
1、先導入命名
1、MVC中有一個異常過濾器,自己建立一個過濾器,並繼承自HandleErrorAttribute,在重寫一下OnException()方法。
1 namespace OA.APP.Error 2 { 3 public class MyExceptionAttribute:HandleErrorAttribute 4 { 5 //寫一個隊列,隊列類型是Exception類型,只要拋異常了,都同寫一個隊列,因此是靜態的。 6 //Queue:是一個隊列類型。 7 public Queue<Exception> queueException = new Queue<Exception>(); 8 9 /// <summary> 10 /// 重寫OnException方法,用於捕獲異常數據。 11 /// </summary> 12 /// <param name="filterContext"></param> 13 public override void OnException(ExceptionContext filterContext) 14 { 15 base.OnException(filterContext); 16 //獲取異常對象。 17 Exception ex = filterContext.Exception; 18 //把錯誤寫入到隊列中。 19 queueException.Enqueue(ex); 20 //跳轉到自己定義的錯誤頁。 21 filterContext.HttpContext.Response.Redirect("/Error/ErrorHtml.html"); 22 } 23 } 24 }
2、在App_Start()文件夾中的FilterConfig類中注冊自己寫的過濾器。
1 public class FilterConfig 2 { 3 public static void RegisterGlobalFilters(GlobalFilterCollection filters) 4 { 5 //filters.Add(new HandleErrorAttribute()); 6 //注冊自己寫的異常過濾器。 7 filters.Add(new Error.MyExceptionAttribute()); 8 } 9 }
3、在程序入口的地方(也就是Global文件中)開一個線程,用於掃描異常,並讓Global文件繼承自SpringMvcApplication。
1 //public class MvcApplication : System.Web.HttpApplication 2 //SpringMvcApplication 繼承自System.Web.HttpApplication。 3 public class MvcApplication : SpringMvcApplication 4 { 5 protected void Application_Start() 6 { 7 log4net.Config.XmlConfigurator.Configure(); 8 9 AreaRegistration.RegisterAllAreas(); 10 WebApiConfig.Register(GlobalConfiguration.Configuration); 11 FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); 12 RouteConfig.RegisterRoutes(RouteTable.Routes); 13 BundleConfig.RegisterBundles(BundleTable.Bundles); 14 15 string fullPath = Server.MapPath("/Error/ErrorLog.txt"); 16 string beginExceptionStr = DateTime.Now.ToString() + "----------->異常信息如下:\r\n"; 17 string endExceptionStr = "\r\n\r\n"; 18 19 //QueueUserWorkItem()將方法排入列隊以便執行。在匿名函數中判斷隊列中是否有數據,以及寫錯誤信息到日志中。 20 //開啟一個線程,掃描異常信息隊列。 21 ThreadPool.QueueUserWorkItem((c) => 22 { 23 while (true) 24 { 25 //判斷隊列中是否否有數據。 26 if (MyExceptionAttribute.QueueException.Count > 0) 27 { 28 //通過Dequeue()方法,拿到異常對象。 29 Exception ex = MyExceptionAttribute.QueueException.Dequeue(); 30 if (ex != null) 31 { 32 //將異常對象,寫入到日志中。 33 //使用File類的時候,如果文件不存在就會自己創建。 34 //如果請求的控制器出現異常了,會在Error文件夾中生成一個ErrorLog.txt文件。 35 File.AppendAllText(fullPath, beginExceptionStr + ex.ToString() + endExceptionStr); 36 } 37 else 38 { 39 System.Threading.Thread.Sleep(3000); 40 } 41 } 42 else 43 { 44 //休眠3秒。 45 Thread.Sleep(3000); 46 } 47 } 48 }); 49 } 50 }
4、如果請求的控制器拋異常了,那么會顯示錯誤信息。
5、格式如下:
End。