天天看點

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

    架構,從另外一個角度說,就是一個半成品的應用程式,既然如此,架構在運作的過程中也會遇到諸多的異常、錯誤情況,我們需要将這些情況記錄下來,以便在發生問題時為我們的診斷提供必要的幫助。

    最最開始,那還是在ESFramework的前身即EnterpriseServerBase的時候,由于當時隻是将EnterpriseServerBase作為一個類庫,而并沒有提升到一個架構的高度,是以是沒有必要為之配備一個日志記錄器(Logger),就像你從來不曾看到在使用.NET類庫時還必須傳個日志記錄器給它,以使.NET類庫中的API碰到額外情況時能夠記錄下錯誤資訊。類庫中的API遇到額外情況時通常是抛出異常或傳回錯誤碼(C API的常用方式)。

    到了架構這一層,就不能僅僅隻是抛出異常、或傳回錯誤碼這麼簡單了。原因在于,幾乎所有的架構都有IOC的能力(正是這種IOC能力才能稱之為架構,才能稱之為半成品的應用),即,不是由你去調用架構的API,而是架構調用你寫好的方法或接口。在這種情況下,控制權發生了轉移,架構成了主動的角色。既然如此,如果架構運作抛出異常的話,這個異常該由誰去截獲了?是以,架構中具有IOC能力的那些類/元件(言外之意,一個架構中并非所有的元件/類都有IOC能力,很多元件/類都類似于普通類庫中的API)在遇到異常情況時不能簡單的抛出異常了事,更好的辦法當然是主動地記錄異常日志。

    從EnterpriseServerBase上升到ESFramework一個很重要的變化就是為之配備一個日志記錄器,即我們這裡将要講到的IEsbLogger。IEsbLogger接口非常簡單:

    public interface IEsbLogger

    {

        void Log(string msg ,string location ,ErrorLevel level) ;

        bool Enabled{set ;}

    }

    [EnumDescription("異常/錯誤嚴重級别")]

    public enum 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連接配接池中斷等。

    感謝關注!