天天看點

異常日志—— ESFramework 4.0 快速上手(03)

一.IAgileLogger接口

    首先,ESFramework架構使用ESBasic.Loggers.IAgileLogger接口來記錄日志:

    public interface IAgileLogger

    {

        void Log(Exception ee, string location, ErrorLevel level);

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

    }

    注意,我們規定實作IAgileLogger接口的類不允許再抛出異常,也就是說ESFramework架構在調用IAgileLogger接口的Log方法時,是安全的,是不需要再try...Catch的。

二.EsfLogger屬性

    ESFramework架構内部有條隐藏的規則,即,所有需要用到日志記錄的元件或類,必須暴露類型為IAgileLogger且名為"EsfLogger"的可寫屬性(setter),以表示該元件/類需要日志記錄的支援。如:

        #region EsfLogger

        private IAgileLogger esfLogger = new EmptyAgileLogger();

        public IAgileLogger EsfLogger

        {

            set

            {

                if (value != null)

                {

                    this.esfLogger = value ?? new EmptyAgileLogger();

                }

            }

        }

        #endregion

    EmptyAgileLogger是采用nullobject模式的IAgileLogger接口實作,使用它,即表示不需要記錄日志。

    如果我們使用類似Spring這樣的IOC容器來裝配ESFramework的元件,那麼就可以利用ESFramework架構的這條規則來快速的一次性為所有元件的EsfLogger屬性指派,而不是手動地去一個元件一個元件的指派。像下面這樣:

        private static void ConfigEsbLogger()

            IList<object> objList = new List<object>();

            string[] names = SpringContext.GetObjectDefinitionNames();

            foreach (string name in names)

                objList.Add(SpringContext.GetObject(name));

            //從容器中找出用于日志記錄的IAgileLogger對象 

            IAgileLogger logger = (IAgileLogger)SpringContext.GetObject("esfLogger");

            //周遊集合中的每個元件執行個體,如果其有EsfLogger屬性,則将日志記錄對象指派給它。

            ESBasic.Helpers.ReflectionHelper.SetProperty(objList, "EsfLogger", logger);

三.ESFramework中用到日志記錄的重要元件

    ESFramework架構中有很多元件都用到了日志記錄器,其中最重要的有如下幾個元件:網絡引擎元件(包括服務端引擎、用戶端引擎、TCP引擎、UDP引擎、二進制引擎、文本引擎)、消息分派器元件、使用者管理器元件。我們一一做簡單解釋。

1、網絡引擎元件

    所有的網絡引擎都繼承自INetEngine接口,而該接口中就定義了"EsfLogger"的可讀寫屬性:

  IAgileLogger EsfLogger { get; set; }

   網絡引擎主要在什麼情況下使用日志記錄器了?

(1)當接收到格式不正确的消息時。

      比如,當使用文本協定時,接收到的消息的起始辨別符不正确。這種情況下,網絡引擎就認為收到了錯誤或惡意的消息,将記錄消息來源IP、消息的内容到日志中。如果是TCP引擎,引擎還會斷開對應的TCP連接配接。

(2)當從網絡讀資料或往網絡寫資料發聲異常時。通常有兩種情況:一是正在讀寫資料的時候網絡斷開;二是網絡狀況不好,寫資料逾時。

2.消息分派器元件 MessageDispatcher

    當網絡引擎接收到正确的消息後,會交給消息分派器去分派消息。

(1)當消息分派器根據消息的類型找不到對應的消息處理器(IMessageProcesser)時,将會記錄日志。

      我們可以根據日志發現哪些類型的消息沒有被處理。這種情況很少出現,因為通常在消息協定的設計階段,我們就為每種類型的消息設定了正确的消息處理器。除非,是消息的類型配置出錯了。

(2)當消息分派器調用消息處理器處理消息時,消息處理器的方法抛出了異常,這個異常會被消息分派器記錄到日志。

      消息處理器是由應用實作的,交由架構回調。消息處理器抛出異常,通常說明我們的業務邏輯處理有bug,這樣的日志需要引起我們的高度重視,找到bug并解決bug。

3.使用者管理器元件 IUserManager

    使用者管理器使用日志記錄器記錄使用者的上下線、逾時掉線、被擠掉線等事件。并且其提供了AppLogEnabled屬性用于控制是否記錄這些日志,對于大型系統來說,這個屬性通常是關閉的。

四.快速引擎的日志記錄

    IAgileLogger logger = new FileAgileLogger(AppDomain.CurrentDomain.BaseDirectory + "EsfLog.txt");

    你不需要在運作目錄下手動建立EsfLog.txt,因為當架構需要記錄日志時,是會自動建立這個檔案的。你可以定期檢查EsfLog.txt檔案的内容,以了解程式現在的運作狀态,以便及時發現異常情況。

<a href="http://www.cnblogs.com/zhuweisky/category/292821.html">《ESFramework 4.0 快速上手》系列所有文章</a>

<a href="http://www.cnblogs.com/zhuweisky/category/292831.html">《ESFramework 4.0 進階進階》系列所有文章</a>