2011-11-18 146 views
1

這不是一個真正的編碼問題,但是在開發新的Logger實現的同時,我從社區獲得了關於我遇到的一些問題的一些反饋。創建一個記錄器

背景

我們的ASP.NET應用程序最初使用log4net。雖然log4net是一款出色的日誌記錄工具,但它並不適合我們的需求,在某些情況下,它甚至會通過日誌記錄的方式導致我們的應用程序出現問題。我們目前正在實施我們自己的日誌系統,它模仿log4net的一些行爲,但也適合我們的需要。我不是在這裏討論log4net的使用或如何配置它。

系統

目前我們有一個系統正在開發。該系統有一個記錄器類,它是一個Singleton(設計缺陷,我知道...),並且該類有一個集合IReporter對象。

每次應用程序調用Logger.Instance.Log(消息)記錄儀將引導這些消息每IReporter隊列裏面,記者在他們的目的地/存儲/記錄的信息的任何責任。

目前我們已經選擇每個IReporter都有一個backgroundthread和一個消息隊列來以自己的速度處理消息。這裏的危險是,當應用程序突然死亡時,我們可能會丟失一些消息。

我們想到的另一種方法是在記錄器上有一個線程池,並讓這些線程在隊列上運行,然後將消息委託給記者。

我關心的是表現。我們首先在記錄器中使用事件來實現此功能,但訪問文件時,生成的線程很快就變得很快。所以現在用這種方法,我們希望限制對資源的訪問

我想要的是那些有類似情況的人以及他們如何解決這個問題。

+3

你看過NLog嗎? HTTP:// n日誌項目。org/ –

+0

我們正在處理一個商業應用程序,所以開源並不是一個真正的選擇atm –

+0

不會立即幫你,但我強烈建議你看一下NLog和Log4net的源代碼。他們竭盡全力確保日誌記錄的高效性。另外,除非在應用程序中配置了日誌,否則可能需要禁用日誌記錄,然後可以在必要時將其打開。這包括在跟蹤語句之前插入if語句塊,或者將跟蹤語句放入委託中,這樣即使在禁用日誌記錄時字符串格式代碼也不會運行。不會幫助BG線程問題,但他們也解決了這個問題(我只是不知道如何:) –

回答

2

我的理解是否正確,並且所有這些進程都訪問同一組文件?在Windows上?

你不應該這樣做,因爲操作系統會做一些複雜的鎖定,這需要時間,或者更糟的是,取決於你如何訪問文件,你可能會遇到死鎖。最好在一個線程上完成所有日誌記錄,然後按順序運行IReporter。

如果您擔心您的軟件可能在日誌操作過程中死掉,請將日誌記錄器放入另一個進程中,由IPC進行通信。但是你確定要重塑syslogd嗎?

+0

目標是爲每個日誌文件設置1個記者,特別是爲了防止多個線程訪問特定的日誌文件並陷入困境。 –

0

您的設計聽起來很像Log4Net與一堆FileAppender s。你應該真的重新考慮你的決定,除非你有沒有要求你沒有分享。 Log4Net的lot更多地使用在現場比你的記錄器有史以來,它有很多的bug和性能問題已經擺脫它。

相關問題