為了方便查詢系統出錯弄個錯誤日誌出來對於維護運維來說是很有必要的。 1、在Asp.Net MVC項目中的App_Start添加一個用於處理異常類的文件ErrorLog讓他繼承HandleErrorAttribute類並重寫OnException方法 在視圖裡面的shared文件夾下麵加一個Error ...
為了方便查詢系統出錯弄個錯誤日誌出來對於維護運維來說是很有必要的。
1、在Asp.Net MVC項目中的App_Start添加一個用於處理異常類的文件ErrorLog讓他繼承HandleErrorAttribute類並重寫OnException方法
public class ErrorLog: HandleErrorAttribute { public override void OnException(ExceptionContext filterContext) { if(!filterContext.ExceptionHandled) { //當前Controller名稱 string controllName = (string)filterContext.RouteData.Values["controller"]; //當前Action string actionName = (string)filterContext.RouteData.Values["action"]; //定義一個HandErrorInfo,用於Error視圖展示異常信息 HandleErrorInfo model = new HandleErrorInfo(filterContext.Exception, controllName, actionName); //時間用來給txt命名 string thisTime = DateTime.Now.ToString("yyyyMMdd"); string errorDetails = $"出錯時間:{DateTime.Now.ToString()},錯誤發生在{model.ControllerName}控制器的{model.ActionName},錯誤類型:{model.Exception.Message}"; string splitLine = "============================下一條=============================="; //日誌存放位置,在項目目錄裡面一個月一個文件夾,一天一個文件 string path = HttpContext.Current.Server.MapPath(@"\ErrorLog\" + DateTime.Now.Year.ToString()+ @"\" + DateTime.Now.ToString("MM") + @"\" ); //判斷文件夾不存在就創建 if (!Directory.Exists(path)) Directory.CreateDirectory(path); //寫入日誌 using (System.IO.StreamWriter file = new System.IO.StreamWriter(path + thisTime+".txt", true)) { file.WriteLine(errorDetails); file.WriteLine(model.Exception.StackTrace); file.WriteLine(splitLine); } //出錯跳轉到指定頁面,如果Global.asax寫了Application_Error方法可以不用寫 ViewResult result = new ViewResult { ViewName = this.View,//設置異常時跳轉的404頁面 ViewData = new ViewDataDictionary<HandleErrorInfo>(model) //定義ViewData,泛型 }; filterContext.Result = result; filterContext.ExceptionHandled = true;//設置異常已處理 } } }
在視圖裡面的shared文件夾下麵加一個Error視圖,裡面就是錯誤日誌,類似於404頁面一樣的功能
2、在App_Start文件夾下麵的FilterConfig.cs文件裡面配置
public class FilterConfig { public static void RegisterGlobalFilters(GlobalFilterCollection filters) { filters.Add(new ErrorLog() { View="Error"}); } }
ErrorLog別寫錯了,裡面有個原始的HandleErrorAttribute類改名為你第一步添加的類
3、最後看一下Gloabl.asax裡面註冊了FilterConfig沒有,一般都是有的
public class MvcApplication : System.Web.HttpApplication { protected void Application_Start() { AreaRegistration.RegisterAllAreas(); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); RouteConfig.RegisterRoutes(RouteTable.Routes); BundleConfig.RegisterBundles(BundleTable.Bundles); } }
4、調用實例,我寫的一個圖片上傳,沒有文件夾拋異常
/// <summary> /// 圖片上傳 /// </summary> /// <param name="file">圖片</param> /// <returns></returns> public ActionResult FileUpLoad1(HttpPostedFileBase file) { var ret = string.Empty; try { string fileName = Guid.NewGuid()+file.FileName; string filePath = Server.MapPath(@"\FileUp2\"); //if (!Directory.Exists(filePath)) // Directory.CreateDirectory(filePath); file.SaveAs(Path.Combine(filePath, fileName)); } catch (Exception ex) { ret = ex.Message + ":" + ex.InnerException; throw new Exception (ex.Message + ":" + ex.InnerException); } if(string.IsNullOrEmpty(ret)) return Json(new { code = "0", msg = "文件上傳成功!", data = "" }); else return Json(new { code = "1", msg = "文件上傳失敗!", data = ret }); }
註意要想記錄日誌一定要把異常拋出來 就是 throw new Exception (ex.Message + ":" + ex.InnerException);
5、下麵的效果