MVC消息队列记录错误日志(HandleErrorAttribute)

这里主要是用将所有错误集中在一起进行写入。(MVC)
直接看具体步骤:

1、创建一个WebApplication

2、[可以在Model文件夹里创建一个类MyExceptionAttribute.cs]

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

namespace WebApp.Models
{
    //继承HandleErrorAttribute,在/App_Start/FilterConfig.cs中 添加MyExceptionAttribute的控制
    public class MyExceptionAttribute:HandleErrorAttribute
    {
        //创建一个队列 静态 所有异常都在同一个队列中 处理
        public static Queue<Exception> ExceptionQueue = new Queue<Exception>();
        public override void OnException(ExceptionContext filterContext)
        {
            base.OnException(filterContext);
            Exception ex = filterContext.Exception;
            //写到队列中
            ExceptionQueue.Enqueue(ex);
            //跳转到 错误页
            filterContext.HttpContext.Response.Redirect("/error.html");
        }
    }
}

2.1、让MyExceptionAttribute继承HandleErrorAttribute、并重写OnException方法。

2.2创建一个静态队列,使所有 错误日志都在同一个队列中进行

public static Queue ExceptionQueue = new Queue();

3、需要将MyExceptionAttribute在 FilterConfig.cs(/App_Start/ FilterConfig.cs)中进行标记

using System.Web;
using System.Web.Mvc;
using WebApp.Models;

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

4、然后在Global.asax开启线程,将队列中的错误日志写入txt文件中。

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;
using WebApp.Models;

namespace WebApp
{
    public class MvcApplication : 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 (MyExceptionAttribute.ExceptionQueue.Count() > 0)
                    {
                        Exception ex = MyExceptionAttribute.ExceptionQueue.Dequeue();
                        if (ex != null)
                        {
                            //将异常 信息写入文件中
                            string fileName = DateTime.Now.ToString("yyyy-MM-dd");
                            File.AppendAllText(fileName + ".txt", ex.ToString(), System.Text.Encoding.UTF8);
                        }
                        else
                        {
                            //如果队列中没有数据 休闲 3000
                            Thread.Sleep(3000);
                        }
                    }
                    else
                    {
                        //如果队列中没有数据 休闲 3000
                        Thread.Sleep(3000);
                    }
                    
                }
            },filePath);
        }
    }
}

4.1、使用线程池ThreadPool中的QueueUserWorkItem方法,QueueUserWorkItem有两个重载,F12查看。

4.2如果队列中没有数据,则休息Thread.Sleep(3000);

5、新建一个控制器Test。进行测试

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

namespace WebApp.Controllers
{
    public class TestController : Controller
    {
        //
        // GET: /Test/
        public ActionResult Index()
        {
            return View();
        }
        public ActionResult ShowResult()
        {
            int a = 2;
            int b = 0;
            int c = a / b;
            return Content(c.ToString());
        }
    }
}

标签: handleerrorattribute, mvc

已有 2 条评论

  1. 咔玛 咔玛

  2. 水友 水友

    学习了, 谢谢

添加新评论