1.首先將捕獲的異常寫到Redis的隊列中html
1 public class MyExceptionAttribute : HandleErrorAttribute 2 { 3 public static IRedisClientsManager clientManager = new PooledRedisClientManager(new string[] { "127.0.0.1:6379", "192.168.1.2:6379" }); 4 public static IRedisClient redisClent = clientManager.GetClient(); 5 public override void OnException(ExceptionContext filterContext) 6 { 7 base.OnException(filterContext); 8 Exception ex = filterContext.Exception; 9 //接下來就是得加入到隊列中進行處理
10 redisClent.EnqueueItemOnList("errorMsg", ex.ToString()); 11 //跳轉到錯誤頁面
12 filterContext.HttpContext.Response.Redirect("/Error.html"); 13 } 14 }
2.而後單獨開啓一個線程對捕獲的數據寫到文件中去redis
public void StartDealLog() { string filePath = Server.MapPath("/Log/"); ThreadPool.QueueUserWorkItem((a) => { while (true) { if (MyExceptionAttribute.redisClent.GetListCount("errorMsg")>0) { // Exception ex = MyExceptionAttribute.MyExceptionQueue.Dequeue();
string ex=MyExceptionAttribute .redisClent.DequeueItemFromList("errorMsg"); if (ex != null) { //將錯誤寫到日誌中取
ILog logger = LogManager.GetLogger("errorMsg"); logger.Error(ex); } else { Thread.Sleep(3000); } } else {//將當前線程掛起(就近)
Thread.Sleep(3000); } } },filePath); }
3.關於上面的代碼的思考服務器
對於每個錯誤,IIS所在的服務器都會啓動一個線程,這對程序服務器壓力仍是很大的,因此能夠考慮使用Redis的分佈式,將上面的處理代碼單獨放到一臺異常處理服務器上,能夠是一個控制檯程序或者網站程序,只要把上面的代碼複製過去就能夠了分佈式