ASP.NET MVC 使用过滤器捕获异常 写入日志

创建一个异常处理类,继承HandlerErrorException重写OnException

把异常信息 放进队列(static)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace UI.Models
{
    public class MyExceptionAttribute:HandleErrorAttribute
    {
        public static Queue exceptionQueue = new Queue();
        public override void OnException(ExceptionContext filterContext)
        {
            base.OnException(filterContext);
            Exception ex = filterContext.Exception;
            //写到队列
            exceptionQueue.Enqueue(ex);
            //跳转到错误页面
            filterContext.HttpContext.Response.Redirect("/Error.html");
        }
    }
}

在过滤器中注册

在App_Start/FilterConfig.cs

using System.Web;
using System.Web.Mvc;

namespace UI
{
    public class FilterConfig
    {
        public static void RegisterGlobalFilters(GlobalFilterCollection filters)
        {
            //filters.Add(new HandleErrorAttribute());
            filters.Add(new UI.Models.MyExceptionAttribute());
        }
    }
}

新建一个Log文件夹,用于存放日志,在根目录新建一个Error.html用于错误重定向。




    
    


    服务器忙,5秒后自动跳转到首页!

在Global.asax(启动处)加代码,用于在线程池里面取出一个线程,定时扫描异常信息队列,写入日志文件。

using Spring.Web.Mvc;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading;
using System.Web;
using System.Web.Mvc;
using System.Web.Optimization;
using System.Web.Routing;

namespace UI
{
    public class MvcApplication :SpringMvcApplication //System.Web.HttpApplication
    {
        protected void Application_Start()
        {
            
            AreaRegistration.RegisterAllAreas();
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);
            //开启一个线程,用于扫描异常信息队列
            string filepath = Server.MapPath("~/Log/");
            ThreadPool.QueueUserWorkItem((a) =>
            {
                while (true)
                {
                    if (UI.Models.MyExceptionAttribute.exceptionQueue.Count()>0)
                    {
                        Exception ex = UI.Models.MyExceptionAttribute.exceptionQueue.Dequeue();

                        if (ex != null)
                        {
                            //将异常信息写到日志文件中
                            string filename = DateTime.Now.ToString("yyyy-MM-dd");
                            File.AppendAllText(filepath + filename + ".txt", ex.ToString(), System.Text.Encoding.UTF8);
                        }
                        else
                        {
                            Thread.Sleep(3000);
                        }
                    }
                    else {
                        Thread.Sleep(3000);
                    }
                }
            },filepath);
        }
    }
}

异常测试(在控制器里面使用1/0产生异常)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using IBLL;
using BLL;
using Model;
namespace UI.Controllers
{
    public class UserController : Controller
    {
        //面向接口编程
        IUserService us { get; set; }
        // GET: User
        public ActionResult Index()
        {

            //调试异常
            int a = 1;
            int c = 0;
            int b = a / c;
            IQueryable users=  us.LoadEntities(u => true);
            User u1=  users.FirstOrDefault();
            return Content(u1.Name);
        }
        public ActionResult Form()
        {
            return View();
        }
        [HttpPost]
        public ActionResult Form(User u)
        {
            //((UserService)us).add(u);
            return Content("添加成功!");
        }
    }
}

项目结构

ASP.NET MVC 使用过滤器捕获异常 写入日志_第1张图片

运行结果:

ASP.NET MVC 使用过滤器捕获异常 写入日志_第2张图片

ASP.NET MVC 使用过滤器捕获异常 写入日志_第3张图片

你可能感兴趣的:(.NET,FrameWork)