2011-12-06 58 views
1

我是log4net的全新用戶,並且我試圖維護一些使用它的遺留代碼。我注意到有兩個告訴log4net登錄到不同位置的靜態類正在相互跳動。啓用記錄到log4net中的兩個不同位置

的類各自具有靜態構造,看起來像這樣

static Logger() { 
    _Logger = new X.LoggingService.AppLogger(
       X.UtilityServer.Configuration.ConfigInfo.LoggerConfigFile); 
} 

除了具有不同的配置值;這兩個靜態類都初始化相同的AppLogger輔助類。第二類初始化是覆蓋第一個類的初始化。我想我已經跟蹤這個問題到這裏:

private ILog Log { 
    get { 
     if (!_ConfiguratorSet) { 
      _ConfiguratorSet = true; 
      XmlConfigurator.Configure(new FileInfo(_ConfigFile)); //<--- STATIC 
     } 
     return _log; 
    } 
} 

因爲我絕對沒有支持線程安全,我應該只是得到刪除if語句?每次我需要記錄一些昂貴的東西時,會撥打XmlConfigurator.Configure?有沒有更好的辦法?該代碼使用的log4net版本1.2.10

回答

1

理想的情況下寫,什麼應該被髮生的事情是:

  1. 配置log4net的(這樣做一次在應用程序啓動 - 這是很慢)
  2. 使用依賴注入將ILog傳遞給類(更好)服務定位器(更糟糕),以獲得所需類中的ILog
  3. 一個配置可以爲您提供多個記錄器,而這些記錄器又可以具有多個可以登錄到的appender各種產出(數據庫,控制檯,隊列等)這給你一個由一個配置文件控制的很大的靈活性。你可以有一個配置文件與兩個不同名稱的文件記錄器,它們將使用兩個不同的appender將數據輸出到兩個文件中。

代碼

private ILog Log { 
    get { 
     if (!_ConfiguratorSet) { 
      _ConfiguratorSet = true; 
      XmlConfigurator.Configure(new FileInfo(_ConfigFile)); //<--- STATIC 
     } 
     return _log; 
    } 
} 

實在是混亂和錯誤。您應該只返回一個日誌,因此根本沒有ifs。這違反了單一責任原則,可能是您看到的錯誤的原因。

+0

我將如何去完成#1 - 配置log4net **一次**?這個代碼庫有許多xml文件位置存儲爲配置設置。當項目X需要登錄時,它會拉下配置文件路徑,並將它傳遞給這個助手類,該類調用XmlConfigurator.Configure並將其傳遞給實際文件(新的FileInto(_ConfigFile)。是否有一種簡單的方法可以解決這個問題重新設計了很多東西? –

+0

在我的項目中,我使用了一種方法,其中一個VS解決方案包含一個項目,這個項目通常由其他項目與解決方案共享,該項目通常稱爲「Core」或「Commons」。我會保留一個靜態類,它提供靜態方法來配置log4net和靜態方法來獲取日誌名稱。通常一個解決方案只有一個入口點,所以我在那裏調用'Configure'方法。 VS解決方案(如Web項目,服務,Win應用程序)? – oleksii

+0

這樣項目X可以只傳遞它需要的Looger的名字,還是更復雜的情況? – oleksii