2012-02-03 52 views
0

我想我錯過了一些東西。我在類庫dll中寫了一個自定義的log4net appender,所以我想我應該通過這個來暴露log4net。通過這種方式,其他人只需添加攜帶log4net的單一日誌記錄類庫,即可獲得自定義appender。如何使類庫dll中的log4net可用?

我是否需要包裝log4net才能做到這一點,或者是否有其他方式公開它?

回答

1

我喜歡包裹的log4net併爲所有需要登錄入口提供單點。 例如。

我的界面會是這樣

public interface ICustomLogger : ILog 
    { 

    } 

我的記錄器類將是這樣的。

public class CustomLogger : ICustomLogger 
     { 
      private ILog log4netLogger; 
      public TMALogger(ILog logger) 
      { 
       log4netLogger = logger; 
      } 
//Plus all the methods that you would need to implement for ICustomLogger 
    } 

LogManager會是這樣的。

public class LogManager 
    { 
     public static ICustomLogger GetLogger(Type type) 
     { 
      ICustomLogger logger = null; 
      try 
      { 
       ILog log4netLogger = log4net.LogManager.GetLogger(type); 
       CustomLogger customLogger = new CustomLogger(log4netLogger); 
       logger = customLogger; 
      } 
      catch (Exception ex) 
      { 
       logger = null; 

      } 
      return logger; 
     } 
    } 

最後記錄器將在課堂上使用像

private readonly ICustomLogger _logger = LogManager.GetLogger(typeof(ClassName)); 

我希望這有助於。

+0

配置在這種情況下如何工作?你還在配置中引用log4net.Appender.ConsoleAppender還是它變成了customdll.Appender.ConsoleAppender? – jimconstable 2012-02-04 00:31:16

+0

Config的工作原理與log4net相同。我仍然參考log4net.Appender.ConsoleAppender,配置部分不會有變化。 – Sumit 2012-02-04 04:56:24

0

如果你寫了一個appender,你需要做兩件事才能使用它:配置它(像其他appender一樣),並確保你的程序集被部署。

爲了配置它,你需要有地方在你的log4net的配置爲您的appender塊:

<appender name="YourCustomAppenderName" type="YourAssemblyNameSpace.YourAppenderType"> 
    .... 
</appender> 

在我的經驗,它工作時,你最好fully qualify程序集,但它不是絕對必要的。第二部分可以通過安裝程序來完成,但也許有點粗糙但很有效的方法是在應用程序中創建對appender程序集的引用。這種方式總會被複制到輸出目錄。

寫這個包裝並不是必要的。編寫一個包裝可能是有原因的,但是如果你希望能夠具有附加功能(例如接受附加參數的方法),就應該這樣做。包裝的另一個原因可能是你可以用別的東西代替log4net(儘管在更新所有配置文件時仍然會有一些工作)

+0

我可以使用appender,但它在內部需要日誌記錄的所有項目中都很有用,所以看起來合乎邏輯的是可以將一個dll添加到項目中。 – jimconstable 2012-02-03 21:57:41

+0

我同意將所有日誌記錄功能放在一個程序集中,但我絕不會考慮將log4net與我的DLL合併,或者在沒有任何理由的情況下編寫包裝程序。 – 2012-02-04 14:43:03