ASP.NET MVC中错误日志信息记录

摘要:
MVC中有一个处理异常的过滤器HandleErrorAttribute1.新建一个类继承自HandleErrorAttribute,然后重写OnException这个方法publicclassMyExceptionAttribute:HandleErrorAttribute{//////可捕获异常数据//////˂paramname="filterContex

MVC中有一个处理异常的过滤器 HandleErrorAttribute

1.新建一个类继承自 HandleErrorAttribute,然后重写OnException这个方法

public classMyExceptionAttribute:HandleErrorAttribute
    {
        /// <summary>
        ///可捕获异常数据
        /// </summary>
        /// <param name="filterContext"></param>
        public override voidOnException(ExceptionContext filterContext)
        {
            base.OnException(filterContext);
            Exception ex =filterContext.Exception;
            //把错误信息写进队列
}
    }

只要程序出错就会执行这个方法。

2.注册定义好的异常过虑器

打开App_Start文件夹中FilterConfig.cs修改

 public static voidRegisterGlobalFilters(GlobalFilterCollection filters)
        {
            //filters.Add(new HandleErrorAttribute());
            filters.Add(newMyExceptionAttribute());
        }

验证一下:在1中定义的过虑器的ex行打一个断点,然后在控制器的action中增加一段出错的代码

 publicActionResult Index()
        {
            int a = Convert.ToInt16("aaa");
            returnContent(a.ToString());
           //return View();
        }

运行可以看到效果:

ASP.NET MVC中错误日志信息记录第1张

3.把错误信息存到队列中

因为直接把错误写到日志会出现多个人同时操作日志文件,会造成并发的问题,所以把错误存到队列,然后从队列中把数据记录到文件中不会造成并发,修改过虑器。

public classMyExceptionAttribute:HandleErrorAttribute
    {
        //创建一个队列
        public static Queue<Exception> execptionQueue = new Queue<Exception>();
        /// <summary>
        ///可捕获异常数据
        /// </summary>
        /// <param name="filterContext"></param>
        public override voidOnException(ExceptionContext filterContext)
        {
            base.OnException(filterContext);
            Exception ex =filterContext.Exception;
            //把错误信息写进队列
execptionQueue.Enqueue(ex);
            //跳转到错误页
            filterContext.HttpContext.Response.Redirect("/Error.html");
        }
    }

4.开启一个新的线程不断的读取队列,把消息写入日志文件

读取消息应该在程序开始的时候就开始执行,在Global.asax.cs中添加代码

 protected voidApplication_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文件夹下就多了一个记录错误日志的文件了。

免责声明:文章转载自《ASP.NET MVC中错误日志信息记录》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇elasticsearch kabana中创建索引flask上传图片或者文件下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

webpack打包(1)

Webpack可以处理js/json资源。生成环境比开发环境具有更多的功能来压缩代码。它可以将ES6模块化为浏览器在webpack.config中识别的模块操作命令npmiwebpackwebpack-cli-g npminit npmiwebpack-cli-D配置并运行webpack以将webpack.config.js文件打包...

微软新一代输入法框架 TSF

目前,市场上的非微软中文输入法基本上只实现IMM框架。自Windows XP开始以来,Windows提供了一个基于COM的新输入框架TSF。但是,Windows Vista和Windows 7用户也可以使用各种基于IMM的输入方法,因为Windows提供了一个组件来将所有TSF请求转换为IMM API。很可能,因为Win8下的许多Imm函数无法使用。)根据微...

oracle触发器调试

如果触发器执行成功,不会出现第4个图,不成功,会出现数据调试信息,具体报错位置会定位到。F7单步执行4.出错时,会出现调试数据,双击调试数据,可以复制出来...

android动态申请权限

申请权限对于安卓开发很重要,从Android6.0开始,Android系统提供动态申请权限的机制,APP在使用危险权限时,需要用户的授权才可进一步操作。...

mac格式化重装系统

4.选择“重新安装MacOS”5.按照以下步骤中的提示进行操作。安装需要半个多小时。在此期间无法断开网络,否则需要重新安装...

adb

ADB(AndroidDebugBridge)ANR(ApplicationNoResponding)ADB实际上是Android调试桥AndroidDebugBridge的缩写。adb是C/S体系结构的命令行工具。这里我们介绍一些常用的命令:adbdevices,获取设备列表和设备状态[xuxu:~]$adbdevicesList-devicesattac...