2010-05-06 22 views
7

TickZoom是一款非常高性能的應用程序,它使用自己的並行庫和多個O/S線程來平滑利用多核計算機。寫入具有多線程性能問題的log4net FileAppender

該應用程序遇到了瓶頸,用戶需要從不同的操作系統線程向LogAppender寫入信息。

FileAppender使用MinimalLock功能,以便每個線程都可以鎖定並寫入文件,然後釋放它以供下一個線程寫入。

如果MinimalLock被禁用,log4net會報告有關該文件已被另一個進程(線程)鎖定的錯誤。

log4net執行此操作的更好方法是讓單個線程負責寫入FileAppender,而其他任何線程只將其消息添加到隊列中。

以這種方式,可以禁用MinimalLock以極大地提高日誌記錄的性能。

此外,該應用程序執行大量CPU密集型工作,因此它還將提高性能,以便使用單獨的線程寫入文件,以便CPU永遠不會等待I/O完成。

所以問題是,log4net是否已經提供了這個功能?如果是這樣,你怎麼做啓用線程寫入文件?也許還有另外一個更高級的appender?

如果不是,那麼因爲log4net已經包裝在平臺中,所以可以在TickZoom代碼中爲此實現單獨的線程和隊列。

真誠, 韋恩

編輯:

感謝看來答案指向開發我們自己的解決方案也許是一個擴展以某種方式log4net的。而且他們清楚地表明log4net不會做這種類型的事情。另外,我們只是意識到我們可能會「濫用」主要用於通知重要事件或調試信息的人類可讀消息的日誌記錄系統。軟件輸出的這一特定部分僅用於驗證系統準確性的自動化工具。

當然,我們也使用log4net以「正常」方式進行調試,警告等。

但是這些更像是「事務日誌」而不是調試或用戶通知日誌。更具體地說,這些日誌不需要直接可讀。如果需要,某種類型的「查看器」可以以ASCII格式顯示內容。

所以我們計劃將這些交易類型的日誌寫入高速二進制存儲。

感謝看起來下面的兩個答案都是對開發我們自己的解決方案的巨大推動。

回答

7

Log4net不支持您描述的確切場景。但是,它提供了其他不鎖的appender,如數據庫appender或UDP appender。這裏有幾個想法:

  1. 登錄您的郵件消息 隊列,然後有一個閱讀器(或 幾個讀者)讀取消息關閉 隊列,並將其寫入日誌。 這提供了發送/寫入消息的可靠機制 。說實話 我不知道是否已經有一個 MSMQ appender,但自己寫 不會太難。

  2. 使用UDP附加目的地發送 消息,然後寫自己的 服務偵聽這些 消息,並將其寫入文件。

我想你可以在這裏發現一個主題...基本上使用非阻塞追加程序的一個(或寫你自己的),並實現自己的服務,從附加目的地接收消息,並將其寫入文件。

+0

感謝您澄清這是不可能的在log4net和微調內部的解決方案。 – Wayne 2010-05-07 06:30:14

1

避免向目標線程添加任何I/O是非常理想的,因此向logging collector線程發送消息是個不錯的主意。我也有時使用目標線程中的System :: Diagnostics :: Debug :: WriteLine來轉儲它的輸出,但是在那裏肯定會有一點鎖定。

當然,添加任何額外的日誌記錄會導致「海森堡」效應,因此您必須以某種方式知道這些影響何時可以忽略,何時不可以,以便有效地記錄高性能線程。

如果你想獲得更多的信息,你可以讓每個線程保存自己的消息列表,然後在迭代之後將其轉儲出去。因此,數據只會在任何線程執行日誌I/O之前的一段時間內有用,但也許您可以捕獲足夠的信息以進行調試。此外,您還可以將單個線程日誌整理成單個日誌進行分析。

3

查看Object Guy的高性能,多線程安全記錄器的記錄器,具有異步記錄功能以及許多其他功能 - 我認爲非常好 - http://www.theobjectguy.com/DotNetLog/。請參閱此頁面上的多線程視頻。