2010-12-09 27 views
1

我們有一個應用程序,該應用程序使用streamwriter記錄到當前的文件。當我們正在擴大應用程序的範圍時,日誌記錄模塊即將出現。該應用程序是多線程的,可以使用數千個線程數來執行。線程數不會觸及CPU,因爲大部分職責都是在運行中處理TCP套接字。但是日誌記錄是一個問題,因爲這裏存在收斂性,並且單個線程的性能在此處受到TAT的影響。在多線程中運行.NET應用程序的日誌記錄最佳實踐

我希望得到大家的意見,關於可以採用哪種架構/設計進行日誌記錄。

我想使用數據庫作爲日誌接收器。但作者將不得不有一個我感覺到的鎖定機制。我不認爲,我應該嘗試在線程中創建大量的記錄器。另一個選項,我想在記錄器頂部進行池化。

我還應該看看MSMQ類技術來快速移出流量嗎?

回答

4

我會看看現有的日誌記錄框架,如log4net或微軟的Enterprise Library Logging Application Block。 (我已經使用了log4net,但不是日誌記錄應用程序塊)。

我非常懷疑你的情況畢竟是獨一無二的 - 如果你選擇第三方解決方案而不是本土解決方案一個,你將能夠從其他開發者的經驗中受益。

如果滾你自己,並希望生產者/消費者模型,你可能想看看併發集合在.NET 4作爲mhenrixon提到,雖然,你幾乎肯定將不得不之間找到平衡性能和可靠性。如果這僅僅用於調試日誌,那麼如果應用程序突然關閉時丟失一些可能無關緊要 - 但是如果日誌包含要保留的審計記錄(具有),則顯然是另一回事。

+0

感謝您的指導。我實際上期待着從像log4net這樣的東西開始,以獲得其他人的經驗優勢。同時,我也在考慮滿足我的具體要求。 – Kangkan 2010-12-09 07:36:25

+0

+1推薦標準產品 – 2010-12-12 20:11:43

1

聽起來好像你是在log4net被稱爲Appender Buffering的東西之後,認爲如果日誌記錄不能是「有損」的,那麼它是不安全的。我推薦使用隊列。我相信任何日誌框架都可以通過MSMQ日誌記錄輕鬆擴展。

2

您還應該考慮NLog,特別是NLog 2.0(目前處於Beta版 - 自9月份以來)。除此之外,NLog 2.0增加了記錄asynchronously的功能。實質上,您可以配置您想要記錄到的目標(等同於log4net Appender)(文件,數據庫等)。然後,通過配置,您可以用一個異步目標封裝器「包裝」每個Target。 NLog還在配置文件中有一個選項來使所有日誌記錄異步。

雖然我們關於日誌記錄的問題,但您也可以考慮使用日誌抽象,如Common.Logging for .NET。這使您可以選擇推遲對底層框架(log4net,NLog等)的最終決定,並且還可以選擇編寫自己的記錄器(可以通過Common.Logging輕鬆公開)。

相關問題