using PaiXie.Utils;using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.Mvc;namespace PaiXie.Pos.Admin { public class ExceptionFilterAttribute : HandleErrorAttribute { //使用预置队列类型存储异常对象 public static QueueExceptionQueue = new Queue (); public override void OnException(ExceptionContext filterContext) { //将异常信息入队 ExceptionQueue.Enqueue(filterContext.Exception); //跳转到自定义错误页 filterContext.HttpContext.Response.Redirect("~/Shared/Error"); base.OnException(filterContext); } }}
using PaiXie.Utils;using System;using System.IO;using System.Text;using System.Threading;using System.Web;namespace PaiXie.Pos.Admin { public class MessageQueueConfig { public static void RegisterExceptionLogQueue() { //通过线程池开启线程,不停地从队列中获取异常信息并将其写入日志文件 ThreadPool.QueueUserWorkItem(o => { while (true) { #region 异常日志处理 try { if (ExceptionFilterAttribute.ExceptionQueue.Count > 0) { Exception ex = ExceptionFilterAttribute.ExceptionQueue.Dequeue(); //从队列中出队,获取异常对象 if (ex != null) { //获得异常堆栈信息 string exceptionMsg = ex.ToString(); //将异常信息写入日志文件中 PlanLog.WriteLog(exceptionMsg, LogType.Error.ToString()); } } else { Thread.Sleep(1000); //为避免CPU空转,在队列为空时休息1秒 } } catch (Exception ex) { ExceptionFilterAttribute.ExceptionQueue.Enqueue(ex); } #endregion } }, null ); } }}