MVC中有一個處理異常的過濾器 HandleErrorAttribute 1.新建一個類繼承自 HandleErrorAttribute,然後重寫OnException這個方法 只要程式出錯就會執行這個方法。 2.註冊定義好的異常過慮器 打開App_Start文件夾中FilterConfig.cs修 ...
MVC中有一個處理異常的過濾器 HandleErrorAttribute
1.新建一個類繼承自 HandleErrorAttribute,然後重寫OnException這個方法
public class MyExceptionAttribute:HandleErrorAttribute { /// <summary> /// 可捕獲異常數據 /// </summary> /// <param name="filterContext"></param> public override void OnException(ExceptionContext filterContext) { base.OnException(filterContext); Exception ex = filterContext.Exception; //把錯誤信息寫進隊列 } }
只要程式出錯就會執行這個方法。
2.註冊定義好的異常過慮器
打開App_Start文件夾中FilterConfig.cs修改
public static void RegisterGlobalFilters(GlobalFilterCollection filters) { //filters.Add(new HandleErrorAttribute()); filters.Add(new MyExceptionAttribute()); }
驗證一下:在1中定義的過慮器的ex行打一個斷點,然後在控制器的action中增加一段出錯的代碼
public ActionResult Index() { int a = Convert.ToInt16("aaa"); return Content(a.ToString()); // return View(); }
運行可以看到效果:
3.把錯誤信息存到隊列中
因為直接把錯誤寫到日誌會出現多個人同時操作日誌文件,會造成併發的問題,所以把錯誤存到隊列,然後從隊列中把數據記錄到文件中不會造成併發,修改過慮器。
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"); } }
4.開啟一個新的線程不斷的讀取隊列,把消息寫入日誌文件
讀取消息應該在程式開始的時候就開始執行,在Global.asax.cs中添加代碼
protected void Application_Start() { AreaRegistration.RegisterAllAreas(); WebApiConfig.Register(GlobalConfiguration.Configuration); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); RouteConfig.RegisterRoutes(RouteTable.Routes); BundleConfig.RegisterBundles(BundleTable.Bundles); string filePath = Server.MapPath("/Log/"); ThreadPool.QueueUserWorkItem((a) => { while (true) { //判斷一下隊列中是否有數據 if (MyExceptionAttribute.execptionQueue.Count > 0) { //出隊 Exception ex = MyExceptionAttribute.execptionQueue.Dequeue(); if (ex != null) { //將異常信息寫到日誌文件中 string fileName = DateTime.Now.ToString("yyyy-MM-dd"); File.AppendAllText(filePath + fileName + ".txt", ex.ToString(), System.Text.Encoding.UTF8); } else { //如果隊列中沒有數據,休息5秒鐘 Thread.Sleep(5000); } } else { //如果隊列中沒有數據,休息 Thread.Sleep(5000); } } }); }
完成,執行一條出錯語句,Log文件夾下就多了一個記錄錯誤日誌的文件了。