ASP.NET MVC中錯誤日志信息記錄


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文件夾下就多了一個記錄錯誤日志的文件了。

 


免責聲明!

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



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