一.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>