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. 小程序之取标签中内容 例如view,text

    // index.wxml页面 data-url为自定义 {{}}中内容可为后台请求到的数据 也可为固定内容例如:data-text="哈哈哈" data-url="ht ...

  2. 每日质量NPM包事件绑定_bindme(详解React的this)

    一.bindme 官方定义: is a helper to bind a list of methods to an object reference 理解: 因为不推荐在render()里构建函数, ...

  3. ip字符串,二进制转十进制输出

    题目: 输入: 第一行输入字符串个数n,余下几行输入ip二进制字符串 输出: 按*.*.*.*格式输出十进制ip 代码实现: package ip; import java.util.Scanner; ...

  4. django认证系统 Authentication

    Django自带一个用户认证系统,用于处理用户账户.群组.许可和基于cookie的用户会话. Django的认证系统包含了身份验证和权限管理两部分.简单地说,身份验证用于核实某个用户是否合法,权限管理 ...

  5. prometheus的agent 二次开发代码参考

    import com.codahale.metrics.MetricRegistry;import io.prometheus.client.CollectorRegistry;import io.p ...

  6. Qt532.数值转为16进制(并填充)

    ZC:QString::number(要转换的数值, 需要转换的目标进制); ZC:QString("%1").arg(要转换的数值, 需要填充到?位, 需要转换的目标进制, 用于 ...

  7. SpringBoot简单的REST风格例子

    关于REST和RESTful的说明请移步至:怎样用通俗的语言解释REST,以及RESTful? 其实我自己也不是十分的理解,只是今天学SpringBoot时看到有个标着REST风格的简单例子,就记录一 ...

  8. js,java时间处理

    1.JS获取时间格式为“yyyy-MM-dd HH:mm:ss”的字符串 function getTimeStr(){ var myDate = new Date(); var year = myDa ...

  9. iview使用的bug

    1.table中排序和render方法不能共存,解决方法:保留render,然后排序不用提供的排序,自己写事件.

  10. stm32cube使用

    1.使用stm32cube生成CAN代码注意事项: a.需要手动配置CAN过滤器 { CAN_FilterConfTypeDef sFilterConfig; uint32_t filterID = ...