2012-06-08 55 views
3

我使用log4net的,其中我是一個靜態類中獲得像這樣的記錄一個基準保持到記錄器的引用:在一個靜態類

internal static class Constants 
{ 
    public static readonly ILog Log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 
} 

,並使用全像這樣的應用程序,參考:

Constants.Log.Info(_message); 

但是我有這樣的感覺,這可能會導致問題,我意識到常量(全局?)變量可能是一件壞事。

  • 這種方法有什麼問題嗎?
  • 是什麼原因?
  • 可以做些什麼來解決這些問題?

回答

-1

這實質上創造了一個signleton,其中有許多問題,包括進行有效的單元測試。單元測試不需要記錄並引入不必要的依賴關係。

您應該考慮使用IoC容器和依賴項注入。

+2

如何依賴日誌解決方案干擾有效的單元測試?我很想看到一個例子。 – tsells

+0

我同意@tsells:記錄可能是規避單身人士的最佳例外(儘管擁有* single * logger是我不主張的)。如果您使用的是日誌記錄框架,我非常懷疑您是否需要自己測試記錄器,或者注入記錄器模擬器?我認爲在爲單元測試啓用日誌記錄功能時沒有太大的傷害,日誌級別可以根據需要進行不同的配置,而且只能幫助解決問題。 – Groo

10

如果您希望能夠輕鬆區分日誌級別併爲每個類使用不同的日誌目標(「appender」),那麼您是對的,即不是最佳方法

它通常建議每個類都有一個靜態ILog情況下,後命名的完全合格的類型:

namespace Animals 
{ 
    public class Dog 
    { 
     private static readonly ILog Log = LogManager.GetLogger(typeof(Dog)); 
    } 

    public class Cat 
    { 
     private static readonly ILog Log = LogManager.GetLogger(typeof(Cat)); 
    } 
} 

雖然這看起來像是與具有單更多的工作,它證明了在長期非常方便。一旦你做到了這一點,很容易區分通過配置文件DogCat日誌級別(例如與log4net語法所示):

<log4net> 

    <!-- appender definitions ommited --> 

    <!-- default for all loggers in Animals namespace --> 
    <logger name="Animals"> 
    <level value="WARN"/> 
    </logger> 

    <!-- ...but we need full debug for Dogs --> 
    <logger name="Animals.Dog"> 
    <level value="DEBUG"/> 
    </logger> 

    <!-- ...and we want to send Cat messages over e-mail --> 
    <logger name="Animals.Cat"> 
    <level value="INFO"/> 
    <appender-ref ref="SmtpAppender"/> 
    </logger> 

</log4net> 

日誌框架log4net的一樣也使用的hierarchical logging的概念:一個記錄器被稱爲另一個記錄器的祖先,如果它的名字後跟一個點是後代記錄器名稱的前綴。要使用此功能,最好避免手動命名記錄器(使用硬編碼string),而是使用類型信息來包含整個名稱空間。

+0

我不同意這種方法。這就要求每個班級的「管道」代碼都是浪費的,並且容易出錯。如果您的日誌記錄解決方案構建得很好 - 可以靜態引用它。許多高端系統都是以這種方式構建的。 – tsells

+0

@tsells - 我必須承認這是我讀過這個答案時的想法,但我懷疑mysef,因此問題的原因。 –

+2

@tsells:好吧,我知道許多系統的構建方式與我在回答中描述的方式完全相同(例如,使用NHibernate記錄器)。這*是'log4net'推薦的方法,我在這裏看不到可能的失敗點(「浪費並容易出錯」)。這也是創建性能影響最小的方法,因爲對運行時記錄器類型解析(如果有單個記錄器時需要這樣做)更少,更不用說線程同步了。如果你有一個這樣的「精心打造的測井系統」的具體例子,那就分享一下吧。 – Groo