你的位置:首页 > ASP.net教程

[ASP.net教程]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文件夹下就多了一个记录错误日志的文件了。

 


帕劳蜜月旅游行程参考帕劳特价旅游多少钱到帕劳游费用报价大全帕劳自助游攻略2015怎样去帕劳旅游赏花游园乐翻天 上海秋季赏花全攻略 美富翁建五星级水下旅馆 躺在床上看珊瑚 北领地旅游局大中华区第三次路演完美落幕 铂涛酒店集团以消费体验为导向 搭建品牌生态圈 2015年小梅沙海洋世界门票优惠政策?深圳小梅沙海洋世界学生半价吗? 深圳小梅沙海洋世界高考生优惠活动?深圳海洋世界凭准考证优惠吗? 2015深圳海洋世界七夕节活动?深圳小梅沙海洋世界七夕节有什么优惠? 深圳海洋世界表演时间?深圳小梅沙海洋世界表演一天几场? 芜湖市去巢湖半汤温泉怎么走?芜湖市去巢湖半汤温泉乘车路线? 合肥到巢湖半汤温泉怎么坐车?合肥到巢湖半汤温泉坐车怎么走? 合肥到巢湖半汤温泉有多远?合肥到巢湖半汤温泉开车多长时间? 2015曲阜孔子六艺城五一活动?孔子六艺城游玩攻略? 海南兴隆亚洲风情园门票多少啊?有什么特色呢? 厦门快乐谷水上乐园门票多少钱? 海南儋州石花水洞好玩吗? 海南兴隆亚洲风情园好玩吗? NJM2904X Datasheet NJM2904X Datasheet NJM2584A Datasheet NJM2584A Datasheet NJM2903X Datasheet NJM2903X Datasheet 品质江西旅游 品质江西旅游 品质江西旅游 豪华江西旅游 豪华江西旅游 豪华江西旅游 江西旅游的价格 江西旅游的价格 江西旅游的价格