我想寫我自己的日誌記錄類(在C#),它實現了一個標準接口,這是我可以從代碼的任何部分調用。靈活的日誌界面設計
我的想法是讓多個Log類實現Logger接口,每個Log類都爲其特定的日誌目標,例如,FileLogger將實現日誌記錄到文件,TextBox記錄器將實現登錄到Form中的Multi Line TextBox ,DBLogger將執行日誌記錄到數據庫表等。
此外,每個記錄器類可以有一個嵌套記錄器或鏈式記錄器類,以便從應用程序代碼對Log()方法的單個調用可以記錄消息在多個目的地;例如在一次調用中登錄到Form上的文件和文本框。
我現在面臨的困難是:
通常我登錄到運行日誌文件(將包含調試所需的所有日誌消息),審查日誌文件(僅包含日誌信息進行審查由用戶或需要用戶操作),屏幕上的多行文本框(其將複製所有日誌消息以向用戶提供進度指示)和另一多行文本框(其將只記錄用戶審閱所需的消息)。
當我打電話logger.Log(消息),一些消息可能不適用於特定日誌目的地。例如,某些消息可能只打算記錄在正在運行的日誌文件或進度文本框中,但不會記錄在用戶審閱文本框中,反之亦然。
由於記錄儀將被鏈接,這樣一個函數調用可以登錄到所有需要的目的地,如何可以在特定的記錄器識別日誌消息不適用於它,並因此忽略日誌消息?
我的示例日誌接口是:
public interface Logger
{
public void Log(string msg);
public void Log(string msgType, string msg);
public void InitLogSession();
public void EndLogSession();
public void AddLogger(Logger chainedLogger);
public void RemoveLogger(Logger chainedLogger);
}
public class FileLogger : Logger
{
//implement methods
}
public class TextBoxLogger : Logger
{
//implement methods
}
public class DBLogger : Logger
{
//implement methods
}
EDIT 1:
爲了更精確,可能有4個記錄程序:2個文件記錄器和2個文本記錄器。一個特定的消息是爲1個文本記錄器和1個文件記錄器而設的;我的設計應如何處理?
編輯2: 請不要建議現有的日誌框架。我只是想自己寫!
編輯3: 確定。我有一個設計。請給出您的反饋,並填補空白。
修訂後的界面:
public interface Logger
{
public void Log(string msg);
public void Log(string msgType, string msg);
public void Log(int loggerIds, string msg);
public void Log(int loggerIds, string msgType, string msg);
public void InitLogSession();
public void EndLogSession();
public int getLoggerId();
}
public enum LoggerType
{
File,
TextBox
};
public class LoggerFactory
{
public Logger getLogger(LoggerType loggerType)
{
}
}
的的LoggerFactory類將實例化一個記錄器的唯一方式。這個類將爲記錄器的每個實例分配一個唯一的ID。這個唯一的ID將是2的冪。例如,第一個記錄器將獲得id 1,第二個將獲得id 2,第三個將獲得4,並且第四個將獲得8,依此類推。
返回的記錄器對象可以被轉換爲特定的類,並且調用者可以設置更多的值,比如filePath,textbox等,否則我可以在LoggerFactory中有多個方法:每種類型的記錄器都有一個將接受具體的參數。
因此,假設我們有4個伐木工人有IDS 1,2,4,8。 必須由第一和第三個記錄器處理的特定消息(即,記錄器的ID 1和4)具有使用以下函數來記錄:
public void Log(int loggerIds, string msg);
的值被傳遞到loggerIds應該是「0101」。每個記錄器將檢查其記錄器ID位是否爲ON。如果是的話,只有它會記錄消息。
現在在函數簽名中,我提到了int類型,但是它是用於執行位操作和比較的特定優化類型?
在這種方法中,最大數量可能有限制。的伐木工人,但這對我來說很好。請提供您的反饋。
注意:目前我仍在.NET 2.0上。如果可能的話,在.NET 2.0中建議解決方案,否則我可以移動到更高版本。
本設計的缺點:每個需要登錄的類需要了解應用程序實例化的所有可用記錄器,並據此設置位模式。任何想法如何有鬆散耦合的設計?
好吧... _you_用來決定什麼記錄器記錄什麼信息的邏輯是什麼? –
我認爲這是他的問題。 –
你想把這作爲一個練習嗎?因爲有框架已經做得很好(比如[log4net](http://logging.apache.org/log4net/))。這些框架使用配置文件來定義單個記錄器的行爲方式(如果以及在何處發送它們的輸出)。代碼中的每個記錄器都需要有一個唯一的名稱,以此來確定輸出(或多個輸出)。 – Groo