自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

關(guān)于面向切面編程的部分內(nèi)容-錯(cuò)誤處理機(jī)制

開(kāi)發(fā) 后端 項(xiàng)目管理
但是把錯(cuò)誤信息寫(xiě)到內(nèi)存是很快。寫(xiě)到硬盤上就有一堆的問(wèn)題。比如說(shuō)讀寫(xiě)慢、并發(fā)問(wèn)題。

錯(cuò)誤處理機(jī)制。

面對(duì)多個(gè)web服務(wù)器,多線程處理,我們想把錯(cuò)誤信息記錄到一個(gè)txt文檔中。

但是把錯(cuò)誤信息寫(xiě)到內(nèi)存是很快。寫(xiě)到硬盤上就有一堆的問(wèn)題。比如說(shuō)讀寫(xiě)慢、并發(fā)問(wèn)題。

今天我們就利用這個(gè)實(shí)現(xiàn)錯(cuò)誤處理 此文以MVC為例

1、首先要在  golable  文件的  protected void Application_Start()


注冊(cè)一個(gè)錯(cuò)誤處理機(jī)制。

MVC中自帶一個(gè)  過(guò)濾器

FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);

image

這里面 我們看到這個(gè)過(guò)濾器

2、其實(shí)就是在 app_Start文件夾下面 的 FilterConfig.cs 文件

image

3、 打開(kāi)FilterConfig.cs文件

就寫(xiě)了一個(gè)注冊(cè)事件。我們看得到 這個(gè)是對(duì)錯(cuò)誤處理機(jī)制

image

(當(dāng)然 ,你們看到的是  HandleErrorAttribute 這個(gè)類)

4、所以你們可能覺(jué)得奇怪,我們來(lái)查看MyExceptionAttribut的定義看一下

image

繼承了HandleErrorAttribute

這里我把這個(gè)類的代碼貼一下


 

  1. public class MyExceptionAttribute : HandleErrorAttribute 
  2.     { 
  3.         //  private static object obj = new object(); 
  4.         public static ConcurrentQueue<Exception> ExceptionQueue = new ConcurrentQueue<Exception>();//定義隊(duì)列 
  5.  
  6.         /// <summary> 
  7.         /// 在該方法中捕獲異常。 
  8.         /// </summary> 
  9.         /// <param name="filterContext"></param> 
  10.         public override void OnException(ExceptionContext filterContext) 
  11.         { 
  12.  
  13.             base.OnException(filterContext); 
  14.             Exception ex = filterContext.Exception;//捕獲異常信息。 
  15.             //將異常信息寫(xiě)到隊(duì)列中。 
  16.             ExceptionQueue.Enqueue(ex); 
  17.             //跳轉(zhuǎn)到錯(cuò)誤頁(yè)面. 
  18.             filterContext.HttpContext.Response.Redirect("/Error.html"); 
  19.  
  20.            
  21.  
  22.         } 
  23.     } 
  24.  
  25.   

主要是定義一個(gè)靜態(tài) 隊(duì)列  ConcurrentQueue

(當(dāng)然你也可以用 Queue。但是微軟說(shuō) 這個(gè)ConcurrentQueue 比 Queue  安全。好像是線程安全的,一堆堆的理論,說(shuō)白了就是用ConcurrentQueue 更安全)

這樣所有的錯(cuò)誤就都在這個(gè)隊(duì)列里面了。(就是內(nèi)存)

這樣總不行吧。內(nèi)存 斷電就沒(méi)有了的啊。

所以我們要想把資料存到 硬盤中。

5、現(xiàn)在又要在

  golable  文件的  protected void Application_Start()


中注冊(cè)一個(gè)消費(fèi)線程(這句話后面會(huì)解釋,看不懂就繼續(xù))就是在 protected void Application_Start()中加入這些代碼,***放最前面。

內(nèi)容就是線程池開(kāi)啟一個(gè)線程 從剛剛定義的 MyExceptionAttribute的 ExceptionQueue隊(duì)列里面取出項(xiàng)來(lái)。

將錯(cuò)誤信息最加到文件后面。如果隊(duì)列為空,就線程停留3秒。


 

  1. string filePath = Server.MapPath("/Log/"); 
  2.             ThreadPool.QueueUserWorkItem((a) => 
  3.             { 
  4.  
  5.                 while (true)//注意:線程不能結(jié)束。后面寫(xiě)到隊(duì)列中的數(shù)據(jù)沒(méi)法處理。 
  6.                 { 
  7.  
  8.     // 這里可以加一條   if (MyExceptionAttribute.ExceptionQueue.Count() > 0) 
  9. //{  發(fā)送郵件到管理員} 
  10.                     if (MyExceptionAttribute.ExceptionQueue.Count() > 0
  11.                     { 
  12.                         // Exception ex= MyExceptionAttribute.ExceptionQueue.Dequeue();//從隊(duì)列中取出數(shù)據(jù). 
  13.                         Exception ex = null
  14.                         bool isResult = MyExceptionAttribute.ExceptionQueue.TryDequeue(out ex); 
  15.                         if (ex != null && isResult) 
  16.                         { 
  17.                             string fullPath = filePath + DateTime.Now.ToString("yyyy-MM-dd") + ".txt"
  18.                             File.AppendAllText(fullPath, ex.ToString()); 
  19.                          //   ILog logger = LogManager.GetLogger("errorMsg"); 
  20.                           //  logger.Error(ex.ToString()); 
  21.                         } 
  22.                         else 
  23.                         { 
  24.                             Thread.Sleep(3000); 
  25.                         } 
  26.                     } 
  27.                     else 
  28.                     { 
  29.                         Thread.Sleep(3000);//避免造成CPU的空轉(zhuǎn)。 
  30.                     } 
  31.                 } 
  32.  
  33.   
  34.  
  35.             }, filePath); 

6、總結(jié)。

這個(gè)就是一個(gè)生產(chǎn)者消費(fèi)者的模式。

生產(chǎn)者就是 產(chǎn)生錯(cuò)誤的源頭。 消費(fèi)者就是注冊(cè)保存日志的方法。

中間有一個(gè)倉(cāng)庫(kù)就是    那個(gè)靜態(tài)錯(cuò)誤隊(duì)列。

可以看到 系統(tǒng)產(chǎn)生的錯(cuò)誤臨時(shí)存放于內(nèi)存中。然后一個(gè)新的線程 去讀寫(xiě)靜態(tài)錯(cuò)誤隊(duì)列。

正常情況 需要在錯(cuò)誤隊(duì)列里面加一個(gè)錯(cuò)誤隊(duì)列數(shù)字大于1000條的時(shí)候  發(fā)警告到郵箱的功能。那樣感覺(jué)有點(diǎn)問(wèn)題復(fù)雜化了,畢竟這里只是講錯(cuò)誤處理。

7、log4net 我前面講過(guò)的一個(gè)開(kāi)源框架 記錄錯(cuò)誤很好。

這里提供一個(gè)連接    log4net配置方法你可以把那個(gè)一起并到這里。那么就會(huì)有

把protected void Application_Start()中添加 的代碼

改成。注意是改成:

 

  1. log4net.Config.XmlConfigurator.Configure(); 
  2.             //開(kāi)始一個(gè)線程,查看異常隊(duì)列 
  3.             string filePath = Server.MapPath("/Log/"); 
  4.             ThreadPool.QueueUserWorkItem((a) => 
  5.             { 
  6.  
  7.                 while (true)//注意:線程不能結(jié)束。后面寫(xiě)到隊(duì)列中的數(shù)據(jù)沒(méi)法處理。 
  8.                 { 
  9.                     if (MyExceptionAttribute.ExceptionQueue.Count() > 0
  10.                     { 
  11.                         // Exception ex= MyExceptionAttribute.ExceptionQueue.Dequeue();//從隊(duì)列中取出數(shù)據(jù). 
  12.                         Exception ex = null
  13.                         bool isResult = MyExceptionAttribute.ExceptionQueue.TryDequeue(out ex); 
  14.                         if (ex != null && isResult) 
  15.                         { 
  16.                             string fullPath = filePath + DateTime.Now.ToString("yyyy-MM-dd") + ".txt"
  17.                             //File.AppendAllText(fullPath, ex.ToString()); 
  18.                             ILog logger = LogManager.GetLogger("errorMsg"); 
  19.                             logger.Error(ex.ToString()); 
  20.                         } 
  21.                         else 
  22.                         { 
  23.                             Thread.Sleep(3000); 
  24.                         } 
  25.                     } 
  26.                     else 
  27.                     { 
  28.                         Thread.Sleep(3000);//避免造成CPU的空轉(zhuǎn)。 
  29.                     } 
  30.                 } 
  31.  
  32.   
  33.  
  34.             }, filePath); 

這樣就會(huì)按照你的要求把錯(cuò)誤日志記錄到

app_data文件夾下面。(前提是你有未處理的錯(cuò)誤 。呵呵)

看到下圖就成功了

image

題外話(

沒(méi)有就自己創(chuàng)一個(gè)   var s=3/0;

這樣就可以了。

 

責(zé)任編輯:王雪燕 來(lái)源: 博客園
相關(guān)推薦

2009-06-19 16:20:14

ASP.NET錯(cuò)誤處理

2009-07-31 11:28:42

錯(cuò)誤處理機(jī)制ASP.NET

2021-03-02 09:12:25

Java異常機(jī)制

2009-07-19 09:05:03

魔獸世界審批

2012-04-13 09:32:19

微軟路線圖

2023-04-20 11:30:12

2012-02-10 10:32:33

JavaSpring

2020-08-20 10:16:56

Golang錯(cuò)誤處理數(shù)據(jù)

2009-08-24 09:46:40

面向切面編程AOP

2021-09-27 10:04:03

Go程序處理

2011-03-17 09:20:05

異常處理機(jī)制

2020-09-15 08:28:17

JavaScript錯(cuò)誤處理

2021-09-27 15:33:48

Go 開(kāi)發(fā)技術(shù)

2021-04-14 07:08:14

Nodejs錯(cuò)誤處理

2023-10-26 15:49:53

Go日志

2024-03-27 08:18:02

Spring映射HTML

2020-09-14 08:35:36

JavaScript編程開(kāi)發(fā)

2013-09-17 10:37:03

AOPAOP教程理解AOP

2021-04-29 09:02:44

語(yǔ)言Go 處理

2011-07-01 14:20:59

Qt 事件
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)