2011-03-16 64 views
7

我有一個包含多個C#項目的C#解決方案。我打算在其中添加日誌記錄。此日誌記錄應該在所有項目中都可用,並且最好使用log4Net和滾動文件日誌。log4Net悖論

有了上述前提,我可以想出兩種方法來做到這一點。在該解決方案的切入點(Program類)

  1. 初始化記錄器&獲取記錄器實例&使用它作爲每個需要記錄類的成員變量。

  2. 添加另一個項目,工具&用靜態日誌記錄方法定義一個Logging類。該類應在解決方案的入口點(程序類)中初始化。

什麼是最好的解決方案?

回答

6

我有類似的情況。我們所做的是爲所有項目使用1個應用程序配置,並使用鏈接來引用它。

在App.config爲您的應用程序設置log4net的配置部分

<configSections> 
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/> 
    </configSections> 

後來設置追加程序:

<log4net> 
<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender"> 
... 

而且每個班要記錄你把線類似於這樣:

private static readonly ILog log = log4net.LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 

然後每個類抓住同一個記錄器(singleton)。 會爲你工作嗎?

+0

它確實有效。謝謝 – vrrathod 2011-04-16 03:23:50

0

在我的項目中,我寫了一個圍繞LOG4NET的封裝(理論上)與其他日誌框架(如NLOG)交換它,而不會破壞我的代碼。

我自己的日誌記錄類可以通過靜態單例訪問。它在這個單例中進行初始化。

(BTW:I published the source code over at the Code Project前一段時間,也許它給你一些啓發)

+1

你有沒有發現自己交換log4net? – Tundey 2011-03-16 19:06:15

+0

還沒有,我完全滿意:-)爲什麼我寫封裝的另一個原因是使功能更易於使用(對我來說)。 – 2011-03-16 19:09:33

0

如果你想在入口點初始化的東西每一次,那麼你自己寫的依賴注入的情況下, 。使用DI庫(如Unity,Castle或任何您個人喜歡的口味),您可以執行構造函數注入或屬性注入來讓您的記錄器類(或Log4Net)自動初始化。

另外,您可以使用DI內核使其成爲單例,以便您只有一個活動實例。

0

爲了解決Queso的回答,我們在運行時導入了帶反射的.dll文件。爲了讓他們使用Log4Net,我們創建了一個包含所有相應配置部分的log4net.config文件。我們還使用相同的代碼行來初始化Queso引用的每個類中的日誌。單獨的配置允許我們在整個應用程序域中使用它。

編輯我們還必須對appsettings文件進行修改以允許此操作。

http://haacked.com/archive/2005/03/07/ConfiguringLog4NetForWebApplications.aspx

0

選項1是要走的路。

如果使用靜態方法,您失去使用分層記錄器的能力。此功能可讓您針對單個類別甚至是整個子系統以不同方式配置日誌輸出,例如YourNameSpace.Security。這tutorial闡述了這個話題(也是其他章節是一個很好的閱讀)。

建立一個包裝肯定不是一個壞主意,但它不是絕對必要的。它允許雖然幾件事情:更改日誌框架,使用DI,增加額外的日誌級別(例如log.Verbose())或不同的重載記錄...

順便說一句。我會初始化這樣的記錄器:

ILog log = LogManager.GetLogger(typeof(YourClass)); 
+0

儘管這看起來就像如果你要你的模板類,包括:在默認情況下,是有一個很好的理由不使用copypasta的版本(GetCurrentMethod.DeclaringType)一個確定的解決方案? – 2011-08-22 16:18:08

+0

還有另一種獲取記錄器的方法。看看這個:http://stackoverflow.com/questions/1466740/using-getcurrentmethod-in-supposedly-high-performance-code – 2011-08-23 09:56:26

+0

當然,如果你從來不用登錄一個靜態方法....如果您需要捕獲靜態方法(例如,從擴展方法中記錄),那不是正確的答案,是嗎? – 2011-08-29 06:09:37