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 > )
{
//出队
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();
}
}
else
{
//如果队列中没有数据,休息
Thread.Sleep();
}
}
});
}

完成,执行一条出错语句,Log文件夹下就多了一个记录错误日志的文件了。

转自:https://www.cnblogs.com/wei325/p/5433288.html

【转】ASP.NET MVC中错误日志信息记录的更多相关文章

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

    MVC中有一个处理异常的过滤器 HandleErrorAttribute 1.新建一个类继承自 HandleErrorAttribute,然后重写OnException这个方法 public clas ...

  2. ASP.NET MVC中解决日志并发处理log4net

    本章主要内容是将异常信息写到队列中,然后通过线程写到文本文件中,速度非常快,没有阻塞和延迟加载 1.首先在Model中建一个类MyExceptionAttribute.cs public class ...

  3. ASP.NET MVC中错误处理方式

    /// <summary> /// 标记了HandleError,并指明错误处理页为AboutError.aspx /// </summary> /// <returns ...

  4. ASP.NET MVC中Log4Net记录错误日志的使用

    第一.在管理NuGet程序包 =>下载 Log4Net 第二.在web.config配置Log4Net 1:在<configuration>节点下 <configSection ...

  5. ASP.NET MVC中的错误处理

    ASP.NET MVC中的错误的错误处理跨越了两个主要领域:程序异常和路由异常的处理.前者是关于在控制器和视图中捕获错误的;而后者更多是有关重定向和HTTP错误的. 1.在WebConfig中把过滤器 ...

  6. ASP.NET MVC 学习笔记-7.自定义配置信息 ASP.NET MVC 学习笔记-6.异步控制器 ASP.NET MVC 学习笔记-5.Controller与View的数据传递 ASP.NET MVC 学习笔记-4.ASP.NET MVC中Ajax的应用 ASP.NET MVC 学习笔记-3.面向对象设计原则

    ASP.NET MVC 学习笔记-7.自定义配置信息   ASP.NET程序中的web.config文件中,在appSettings这个配置节中能够保存一些配置,比如, 1 <appSettin ...

  7. asp.net MVC中使用Html.Checkbox提示该字符串未被识别为有效的布尔值错误的解决方法

    在asp.net MVC中使用Html.CheckBox提交后出现该字符串未被识别为有效的布尔值错误,或从类型“System.String”到类型“System.Boolean”的参数转换失败. 错误 ...

  8. ASP.NET MVC编程——错误处理与日记

    ASP.NET MVC的错误处理应考虑到这几个方面:模型绑定期间发生的错误,未能路由到指定操作,针对控制器的错误处理.使用配置文件可以帮助我们处理异常,但是不够灵活和全面:使用HandleErrorA ...

  9. 玩转ASP.NET Core中的日志组件

    简介 日志组件,作为程序员使用频率最高的组件,给程序员开发调试程序提供了必要的信息.ASP.NET Core中内置了一个通用日志接口ILogger,并实现了多种内置的日志提供器,例如 Console ...

随机推荐

  1. 理解 Redis(1) - Redis 简介

    Redis 的含义 全称: REmote DIctionary Server 远程词典服务器 由于支持 string, list, set, ordered set, hash 等多重数据结构, 因此 ...

  2. 前端html5/css基础知识

    https://www.cnblogs.com/clschao/articles/10073124.html

  3. testin 测试用例管理平台

    应用信息:应用图标,应用名称,版本号,应用包名,系统平台[Android,ios,Web/H5,小程序,快应用]项目成员:成员帐号[邮箱],成员姓名,成员角色,成员职位,状态[激活,未激活],操作[移 ...

  4. Linux下解包/打包,压缩/解压命令

    .tar 解包:tar xvf FileName.tar 打包:tar cvf fileName.tar DirName tar.gz和.tgz 解压:tar zxvf FileName.tar.zi ...

  5. SpringMVC获取页面表单参数的几种方式

      以下几种方式只有在已搭好的SpringMVC环境中,才能执行成功!      首先,写一个登陆页面和一个Bean类 <%@ page language="java" co ...

  6. 《剑指offer》第六十三题(股票的最大利润)

    // 面试题63:股票的最大利润 // 题目:假设把某股票的价格按照时间先后顺序存储在数组中,请问买卖交易该股 // 票可能获得的利润是多少?例如一只股票在某些时间节点的价格为{9, 11, 8, 5 ...

  7. 学习笔记52—coverletter

    SCI 论文投稿时需要递送一封 Cover letter.你曾经有没有过这样的经历:刚提笔准备写第一句话就陷入沉思——称呼怎么写?或许有的作者认为直接写 Dear editors 就可以了,不用和老外 ...

  8. 分散的配置文件VS集中的注册表

    假设有这样一个工程,是这样设计的: 1整个软件.服务被切分为 由若干独立的多道程序(多个进程/微服务): 2 这些多道程序只是“机制mechanism”,而“策略strategy”写在各自用到的配置文 ...

  9. 让browserify接收命令行参数,在打包时parse yml配置文件

    功能需求: 1用browserify把各种js打包成浏览器端的1个bundle.js,含有yml配置文件 约束: 1 yml配置文件不在当前工程里(现在还不知道放哪里,以后也会变),希望在打包时,用命 ...

  10. x1c 2018 体验

    总结一下: 2018对比2017优点: 1屏幕完爆:HDR WHD镜面屏完爆 FHD 雾面屏(污+雾,所谓的油腻感),还有色彩!正红色第一次觉得这么好看.别人看得出来看不出来我不知道,至少我能看出来非 ...