MVC异常日志生产者消费者模式记录(异常过滤器)
生产者消费者模式
定义自己的异常过滤器并注册
namespace Eco.Web.App.Models
{
public class MyExceptionAttribute : HandleErrorAttribute
{
public static Queue<Exception> ExceptionQueue = new Queue<Exception>();
public override void OnException(ExceptionContext filterContext)
{
base.OnException(filterContext);
ExceptionQueue.Enqueue(filterContext.Exception);//将异常信息添加到队列中。
filterContext.HttpContext.Response.Redirect("/Error.html"); }
}
}
namespace Eco.Web.App
{
public class FilterConfig
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new MyExceptionAttribute());
}
}
}
开线程写异常信息
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Http;
using System.Web.Mvc;
using System.Web.Optimization;
using System.Web.Routing;
using Spring.Web.Mvc; namespace Spring.Mvc4QuickStart
{
// Note: For instructions on enabling IIS6 or IIS7 classic mode,
// visit http://go.microsoft.com/?LinkId=9394801 public class MvcApplication : SpringMvcApplication
{
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas(); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles); string fileLogPath = Server.MapPath("/Log/");
//WaitCallback
ThreadPool.QueueUserWorkItem((a) =>
{
while (true)
{
if (MyExceptionAttribute.ExceptionQueue.Count > )
{
Exception ex = MyExceptionAttribute.ExceptionQueue.Dequeue();//出队
//string fileName = DateTime.Now.ToString("yyyy-MM-dd")+".txt";
//File.AppendAllText(fileLogPath + fileName, ex.ToString(), System.Text.Encoding.Default);
ILog logger = LogManager.GetLogger("errorMsg");
logger.Error(ex.ToString());
}
else
{
Thread.Sleep();//如果队列中没有数据,休息避免造成CPU的空转.
}
} }, fileLogPath);
} protected override System.Web.Http.Dependencies.IDependencyResolver BuildWebApiDependencyResolver()
{
//get the 'default' resolver, populated from the 'main' config metadata
var resolver = base.BuildWebApiDependencyResolver(); //check if its castable to a SpringWebApiDependencyResolver
var springResolver = resolver as SpringWebApiDependencyResolver; //if it is, add additional config sources as needed
if (springResolver != null)
{
springResolver.AddChildApplicationContextConfigurationLocation("file://~/Config/child_controllers.xml");
} //return the fully-configured resolver
return resolver;
}
}
}
MVC异常日志生产者消费者模式记录(异常过滤器)的更多相关文章
- Lucene.net站内搜索—4、搜索引擎第一版技术储备(简单介绍Log4Net、生产者消费者模式)
		
目录 Lucene.net站内搜索—1.SEO优化 Lucene.net站内搜索—2.Lucene.Net简介和分词Lucene.net站内搜索—3.最简单搜索引擎代码Lucene.net站内搜索—4 ...
 - Java 生产者消费者模式详细分析
		
*/ .hljs { display: block; overflow-x: auto; padding: 0.5em; color: #333; background: #f8f8f8; } .hl ...
 - python3全栈开发-多进程的守护进程、进程同步、生产者消费者模式(重点)
		
一.守护进程 主进程创建守护进程 其一:守护进程会在主进程代码执行结束后就终止 其二:守护进程内无法再开启子进程,否则抛出异常:AssertionError: daemonic processes a ...
 - python 并发编程 锁 / 信号量 / 事件 / 队列(进程间通信(IPC)) /生产者消费者模式
		
(1)锁:进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件,或同一个打印终端,是没有问题的,而共享带来的是竞争,竞争带来的结果就是错乱,如何控制,就是加锁处理. 虽然使用加锁的形式实现了 ...
 - 【多线程】java多线程实现生产者消费者模式
		
思考问题: 1.为什么用wait()+notify()实现生产者消费者模式? wait()方法可以暂停线程,并释放对象锁 notify()方法可以唤醒需要该对象锁的其他线程,并在执行完后续步骤,到了s ...
 - Celery 框架学习笔记(生产者消费者模式)
		
生产者消费者模式 在实际的软件开发过程中,经常会碰到如下场景:某个模块负责产生数据,这些数据由另一个模块来负责处理(此处的模块是广义的,可以是类.函数.线程.进程等).产生数据的模块,就形象地称为生产 ...
 - 10 阻塞队列  &  生产者-消费者模式
		
原文:http://www.cnblogs.com/dolphin0520/p/3932906.html 在前面我们接触的队列都是非阻塞队列,比如PriorityQueue.LinkedList(Li ...
 - 基于Java 生产者消费者模式(详细分析)
		
Java 生产者消费者模式详细分析 本文目录:1.等待.唤醒机制的原理2.Lock和Condition3.单生产者单消费者模式4.使用Lock和Condition实现单生产单消费模式5.多生产多消费模 ...
 - Java并发(基础知识)—— 阻塞队列和生产者消费者模式
		
1.阻塞队列 Blocki ...
 
随机推荐
- Hibernate笔试总结
			
1.在Hibernate中,以下关于主键生成器说法错误的是(AC). A.increment可以用于类型为long.short或byte的主键. B.identity用于如SQL Server.DB2 ...
 - android-Activity(四大组件之一)
			
一.Activity理解 1.定义: 直译为活动,是Android定义四大应用组件之一,也是最重要的用的最多的: 用来提供一个能让用户操作并与之交互的界面 一个应用有多个界面也就是包含多个Activi ...
 - Many2one类型的fields Compute得到的值 搜索
			
v8 默认情况下compute的值不存储于数据库中,在高级搜索中也不可以进行搜索 想要对这种类型的值搜索,需要在field的定义中添加search参数,在search的函数中编写搜索逻辑. 例子: r ...
 - vsphere平台windows虚拟机克隆的小插曲
			
问题: 1.克隆完windows虚拟化后输入法乱码. 2.开启远程的情况下远程登录输入正确的密码也无法登录. 解决: 1.更改管理员用户密码(不输入原win7密码更改win7密码). 2.重新启用管理 ...
 - redis虚拟机模拟集群,节点,增加多端口命令
			
Redis启动多端口,运行多实例 使用redis在同一台机器上,启用多个端口,实现多个实例,完成集群的模拟实现. 启动多实例 redis默认启动端口为6379,我们可以使用 --port 来指定多个端 ...
 - Learn ZYNQ Programming(1)
			
GPIO LED AND KEY: part1:gpio leds and gpio btns combination. (include 1~4) part2:use gpio btns inter ...
 - Log4J简单使用
			
一.一般会将commons-logging和Log4j一起使用 原因:1.commons-logging功能较弱 2.log4j功能强大. 所需jar: log4j-1.2.16.ja ...
 - MySQL数据恢复和复制对InnoDB锁机制的影响
			
MySQL通过BINLOG记录执行成功的INSERT,UPDATE,DELETE等DML语句.并由此实现数据库的恢复(point-in-time)和复制(其原理与恢复类似,通过复制和执行二进制日志使一 ...
 - FIO 测试磁盘iops 以及读写
			
最近在做mariadb的性能,感觉io 有瓶颈,就使用fio 来测试一下磁盘.下文为转载文章(温馨提示:此命令很伤硬盘,测试前请备份数据,- -我就写坏了一个.) FIO 是测试IOPS的非常好的工具 ...
 - centos6 搭建ELK
			
mark一下时间:2016年2月19日10:17:09 记录使用 Logstash: Logstash服务的组件,用于处理传入的日志. Elasticsearch: 存储所有日志 Kibana 4: ...