Asp.Net MVC中記錄錯誤日志保存到本地txt文件


為了方便查詢系統出錯弄個錯誤日志出來對於維護運維來說是很有必要的。

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

在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、效果

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM