如前所述,NLOG和log4net的都是很好的日誌框架。正如Jeff在上面提到的,System.Diagnostics也是一個合理的選擇(不僅僅是記錄到EventLog)。試圖給我的答案增加一些價值,而不是僅僅喋喋不休地說,你可以使用TraceSources和免費的Ukadc.Diagnostics library from codeplex來增強你的System.Diagnostics日誌記錄。
使用TraceSources,您可以創建「命名記錄器」,類似於您可以在NLog和log4net中執行的操作。這些TraceSources可以配置爲在某些級別上記錄(每個TraceSource都不相同),並可以將它們發送到不同的目標(TraceListeners)。所有TraceSources都可以登錄到同一個監聽器,或者一些可以登錄到某些監聽器,而其他監聽器則可以登錄到其他監聽器。任何TraceSource也可以發送到多個TraceListeners。
這裏是您如何在代碼中使用TraceSources(假設TraceSource「abc」已在app.config文件中配置爲記錄「Info」和更高優先級的消息並且已配置爲登錄到文件「log」。文本」)。
public class MyClass
{
static TraceSource ts = new TraceSource("abc"); //Common idiom for NLog and log4net, not sure if as common for TraceSource
public void Func1(int x)
{
ts.Information("Entering Func1");
ts.Verbose("x = {0}", x); //Won't log if "abc" is configured to log Info and HIGHER messgaes
ts.Information("Exiting Func1");
}
}
一個巨大Ukadc.Diagnostics的利益,在「普通」 TraceSources,是可以配置的NLOG/log4net的風格輸出格式,所以你可以有在什麼領域在日誌產出和顯示更多的控制格式。
三件事情是非常有用的,從NLOG/log4net的不可用在System.Diagnostics程序是:
能夠自動記錄通話網站的信息(方法/功能)
附加日誌上下文(GDC - 全局日誌記錄屬性,MDC - NLog/log4net說法中的線程日誌記錄屬性)。 System.Diagnostics的確有Trace.CorrelationManager.LogicalOperationStack,它與NDC類似。
Hierarichal伐木工。
分層記錄器意味着你可以配置一個「祖先」記錄器和任何「後代」記錄器將繼承這些設置。例如,假設您有一個完全(名稱空間)限定類型名稱爲Namespace1.Namespace2.Class的類。使用NLog/log4net,您可以爲「Namespace1」配置日誌信息(級別,目標),並且如果您根據Namespace1中任何類型的完全限定名稱請求記錄器,它將繼承Namespace1的設置。您可以通過查看Castle implemented their TraceSource-based logging抽象如何使用TraceSources實現與此類似的功能。特別是,看看Initialize函數。在TraceSource的自定義小包裝器中工作起來非常容易(作爲一個優點),使得TraceSources的配置更容易一些,因爲您不必單獨配置每個TraceSource。請注意,如果沒有找到實際的祖先,您可以通過配置一個名爲「」的TraceSource並在城堡方案中添加一些代碼,默認爲「」配置,從而輕鬆添加具有「根」配置的功能。例如,您可以配置「*」來登錄,比如說Verbose,然後特定配置某些TraceSources(按類或名稱空間)關閉或處於不同的級別。如果沒有hierarichal記錄器,要使用TraceSources執行相同的操作,則需要配置每個TraceSource以詳細記錄「詳細」。
雖然我介紹了很多關於類和名稱空間的記錄器,但NLog,log4net和TraceSources都允許您將記錄器名稱定義爲任意字符串。因此,在冷定義由功能區域的記錄器的層次結構,而不是命名空間/類:
Database
Database.Connect
Database.Query
Database.Update
Database.SQL
Amazon
Amazon.Books
Amazon.Books.Fiction
Amazon.Books.Nonfiction
Amazon.Electronics
Amazon.Electronics.Video
Amazon.Electronics.Music
Amazon.Electronics.Computer
所以,你可以打開「亞馬遜」的日誌記錄和所有亞馬遜的東西日誌(而無需顯式配置每「孩子」TraceSource)和數據庫的東西不會。或者,您可以關閉Amazon並關閉Amazon.Electronics,並且只有Amazon.Books(和兒童)才能登錄。
最後,如果你使用NLog或log4net,值得一提的是NLog剛剛發佈了一個新版本NLog 2.0(測試版)。
+1爲線程安全點,但只有主線程推送日誌事件。感謝您的全面回答。 – 2010-10-14 18:08:34