這不是一個真正的編碼問題,但是在開發新的Logger實現的同時,我從社區獲得了關於我遇到的一些問題的一些反饋。創建一個記錄器
背景
我們的ASP.NET應用程序最初使用log4net。雖然log4net是一款出色的日誌記錄工具,但它並不適合我們的需求,在某些情況下,它甚至會通過日誌記錄的方式導致我們的應用程序出現問題。我們目前正在實施我們自己的日誌系統,它模仿log4net的一些行爲,但也適合我們的需要。我不是在這裏討論log4net的使用或如何配置它。
系統
目前我們有一個系統正在開發。該系統有一個記錄器類,它是一個Singleton(設計缺陷,我知道...),並且該類有一個集合IReporter對象。
每次應用程序調用Logger.Instance.Log(消息)記錄儀將引導這些消息每IReporter隊列裏面,記者在他們的目的地/存儲/記錄的信息的任何責任。
目前我們已經選擇每個IReporter都有一個backgroundthread和一個消息隊列來以自己的速度處理消息。這裏的危險是,當應用程序突然死亡時,我們可能會丟失一些消息。
我們想到的另一種方法是在記錄器上有一個線程池,並讓這些線程在隊列上運行,然後將消息委託給記者。
我關心的是表現。我們首先在記錄器中使用事件來實現此功能,但訪問文件時,生成的線程很快就變得很快。所以現在用這種方法,我們希望限制對資源的訪問
我想要的是那些有類似情況的人以及他們如何解決這個問題。
你看過NLog嗎? HTTP:// n日誌項目。org/ –
我們正在處理一個商業應用程序,所以開源並不是一個真正的選擇atm –
不會立即幫你,但我強烈建議你看一下NLog和Log4net的源代碼。他們竭盡全力確保日誌記錄的高效性。另外,除非在應用程序中配置了日誌,否則可能需要禁用日誌記錄,然後可以在必要時將其打開。這包括在跟蹤語句之前插入if語句塊,或者將跟蹤語句放入委託中,這樣即使在禁用日誌記錄時字符串格式代碼也不會運行。不會幫助BG線程問題,但他們也解決了這個問題(我只是不知道如何:) –