1. 程式人生 > >ESFramework介紹之(24)―― 日誌記錄IEsbLogger

ESFramework介紹之(24)―― 日誌記錄IEsbLogger

    框架,從另外一個角度說,就是一個半成品的應用程式,既然如此,框架在執行的過程中也會遇到諸多的異常、錯誤情況,我們需要將這些情況記錄下來,以便在發生問題時為我們的診斷提供必要的幫助。
    最最開始,那還是在ESFramework的前身即EnterpriseServerBase的時候,由於當時只是將EnterpriseServerBase作為一個類庫,而並沒有提升到一個框架的高度,所以是沒有必要為之配備一個日誌記錄器(Logger),就像你從來不曾看到在使用.NET類庫時還必須傳個日誌記錄器給它,以使.NET類庫中的API碰到額外情況時能夠記錄下錯誤資訊。類庫中的API遇到額外情況時通常是丟擲異常或返回錯誤碼(C API的常用方式)。
    到了框架這一層,就不能僅僅只是丟擲異常、或返回錯誤碼這麼簡單了。原因在於,幾乎所有的框架都有IOC的能力(正是這種IOC能力才能稱之為框架,才能稱之為半成品的應用),即,不是由你去呼叫框架的API,而是框架呼叫你寫好的方法或介面。在這種情況下,控制權發生了轉移,框架成了主動的角色。既然如此,如果框架執行丟擲異常的話,這個異常該由誰去截獲了?所以,框架中具有IOC能力的那些類/元件(言外之意,一個框架中並非所有的元件/類都有IOC能力,很多元件/類都類似於普通類庫中的API)在遇到異常情況時不能簡單的丟擲異常了事,更好的辦法當然是主動地記錄異常日誌。
    從EnterpriseServerBase上升到ESFramework一個很重要的變化就是為之配備一個日誌記錄器,即我們這裡將要講到的IEsbLogger。IEsbLogger介面非常簡單:
    publicinterface IEsbLogger
    {
        
void Log(string msg ,string location ,ErrorLevel level) ;
        
bool Enabled{set ;}
    }

    [EnumDescription(
"異常/錯誤嚴重級別")]
    
publicenum ErrorLevel
    {
        [EnumDescription(
"致命的")]
        Fatal,
        [EnumDescription(
"")]
        High ,
        [EnumDescription(
"普通")]
        Standard ,
        [EnumDescription(
"")]
        Low
    } 
    
   ESFramework並沒有給出IEsbLogger的任何實現,這個實現由應用來完成,你可以選擇將日誌資訊記錄到資料庫、也可以記錄到文字檔案、甚至可以通過訊息佇列傳送到專門分析處理異常日誌的伺服器上。而且,你還可以對不同ErrorLevel的資訊進行不同的分類處理等等。IEsbLogger.Log方法中的location引數表明了該異常發生的位置,通常是類似於“ESFramework.NetWork.SomeClass.SomeMethod”等字串。
   
ESFramework並不記錄所有異常,因為有些異常,框架能夠自行處理。比如,Tcp使用者突然斷開連線,此時對應連線上的讀寫操作將會丟擲異常,而ESFramework會將此異常理解為使用者掉線而觸發相應的事件來通知相關的關注者(比如,ITcpUserManager)。ESFramework記錄那些重要的、不可忽略的、對應用程式的穩定可能產生影響的異常,比如,FS和AS之間的Tcp連線池中斷等。

    最後,簡單說明一下ErrorLevel列舉上的EnumDescription特性的作用,該特性用於在列舉和列舉的描述之間能夠互相解釋和轉換,比如我們實現IEsbLogger.Log方法,將日誌寫入資料庫,可是第三個引數level是個列舉值,該如何記錄了?我們可以通過EnumDescription.GetFieldText()方法將其轉換成對應的描述,比如,ErrorLevel.Fatal列舉值轉換為“致命的”這樣一個字串,這樣就可以方便的存入資料庫或寫入文字了。EnumDescription的定義位於ESFramework的BaseElement目錄下,主要參考並簡化了“大尾巴狼”朋友的EnumDescription實現,感謝“大尾巴狼”的好點子。
    感謝關注!

轉到  :ESFramework 可複用的通訊框架(序)