标签:
本章主要内容是将异常信息写到队列中,然后通过线程写到文本文件中,速度非常快,没有阻塞和延迟加载
1.首先在Model中建一个类MyExceptionAttribute.cs
public class MyExceptionAttribute : HandleErrorAttribute //继承 { public static Queue<Exception> exceptionQuese = new Queue<Exception>();
//重写父类方法,一抛异常就会执行这个方法 public override void OnException(ExceptionContext filterContext) { base.OnException(filterContext); exceptionQuese.Enqueue(filterContext.Exception);//将异常依靠添加到队列中 filterContext.HttpContext.Response.Redirect("/Error.html");//出现异常后转到错误页 } }
2.打开Global.asax文件,找到RegisterGlobalFilters并转到定义,让里面的方法new自己定义的类
public class FilterConfig { public static void RegisterGlobalFilters(GlobalFilterCollection filters) { //filters.Add(new HandleErrorAttribute()); filters.Add(new MyExceptionAttribute()); } }
3.在Global.asax文件下添加如下内容,当应用程序一打开时就执行一个线程,使用线程池,好处是为了避免线程频繁的创建,节省CPU耗用内存
public class MvcApplication : System.Web.HttpApplication { protected void Application_Start() { AreaRegistration.RegisterAllAreas(); WebApiConfig.Register(GlobalConfiguration.Configuration); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); RouteConfig.RegisterRoutes(RouteTable.Routes); BundleConfig.RegisterBundles(BundleTable.Bundles); string fileLogPath = Server.MapPath("/Log/"); ThreadPool.QueueUserWorkItem((a) => {
//一直守着队列看是否有数据 while (true) { if (MyExceptionAttribute.exceptionQuese.Count > 0) { Exception ex = MyExceptionAttribute.exceptionQuese.Dequeue();//出队 string fileName = DateTime.Now.ToString("yyyy-MM-dd")+".txt"; File.AppendAllText(fileLogPath+fileName,ex.ToString(),Encoding.Default); } else { Thread.Sleep(3000);//如果队列中没有数据,休息一回,避免造成CPU空转 } } }, fileLogPath); } }
4.在当前项目下建一个文件夹Log,后续所有错误信息都往里面放
5.建一个控制器Test测试一下
public ActionResult Test() { int a = 2; int b = 0; int c = a / b; return Content(c.ToString()); }
标签:
原文地址:http://www.cnblogs.com/genesis/p/4985624.html