2011-04-06 179 views
5

這是「問題」。我開發的每個庫都記錄了一些東西,但是我不想要求庫用戶知道這一點,並安裝我將使用的log4net或類似的日誌記錄實現。聰明人如何創建獨立程序集?沒有日誌庫的日誌記錄

記錄輸出對圖書館用戶來說並不重要,除非他或她真的想看到調試/信息輸出。在這種情況下,他會安裝log4net並告訴庫以某種方式通過配置文件使用它。否則,我想運送我的圖書館沒有任何不相關的依賴關係。這可能嗎?有什麼選擇?如果有人需要一個啓用了日誌記錄的庫,他會簡單地用另一個版本覆蓋它。在C++中,我會簡單地創建一對dll/so(帶和不帶日誌記錄)。

+0

那麼你在內部使用log4net?爲什麼你不允許用戶指定他/她想要使用的日誌記錄方法? – Kyro 2011-04-06 00:25:55

+0

是的,它確實隱含地引用它。一般來說,我使用我自己的抽象日誌界面。所以也許我可以動態加載一個適當的日誌庫,如log4net。同樣,我需要在所開發的所有庫中共享ILog接口,所以我必須再次至少發佈MyLibrary.dll + MyCompany.Logging.dll :( – 2011-04-06 00:28:37

回答

4

好主意;像這些東西是使圖書館的作者和消費者的生活更輕鬆的細節!

DotNetOpenAuth做到這一點

我知道DotNetOpenAuth庫的行爲你描述的方式。它使用log4net,但只有當它出現並由消費組件配置時。從它的README.Bin.html:

log4net.dll如果存在與V1.2.10, 將允許記錄日誌消息 這個庫發出。

還有你自己的應用程序中的an informative page on how to configure DotNetOpenAuth logging

[編輯] 我檢查他們的源代碼,和它們動態地檢查log4net的組件和負載+線如果存在的話(在Log4NetLogger.cs & Logger.cs)它。正如你在下面的評論中所提到的,他們在編譯期間需要log4net,因爲它在幾個地方被引用。巧妙的部分是,因爲當檢查失敗時,所有log4net特定的代碼被跳過,當log4net程序集丟失時,運行時會出現問題

DotNetOpenAuth是一個開源項目,所以你應該能夠通過瀏覽他們的初始化代碼來模仿他們的方法。

+0

我只是看了一下github,項目文件的確引用了log4net: ... False ... 和庫從log4net.dll導入類型。我沒有檢查,如果沒有運行時創建log4net.dll和log4net記錄器是否工作。可以? – 2011-04-06 11:56:44

3

這是一個很好的跟蹤介紹,這是我更喜歡使用的,並且您的程序集的消費者也可以使用它。

http://www.devx.com/codemag/Article/22040

+0

同意,沒有使用'Trace'但是像往常一樣,一天中的無知規則,CodePlex甚至有一個包,你可以使用更多的跟蹤提供商 – 2011-04-06 02:02:48

+0

好主意,謝謝,我認爲大多數人忽視,因爲它更容易登錄到控制檯(無需配置跟蹤)或者因爲內置的跟蹤功能與log4net相比沒有那麼強大 – 2011-04-06 11:48:35

1

我可以看到的唯一選擇是完全封裝與您的應用程序的東西;兩種選擇:

  • 拿一個開源日誌框架和烘烤它的源代碼到你的應用程序(所以當有人安裝您的應用,他們也在不經意間安裝了記錄儀)。這裏的假設是,你的安裝過程可以覆蓋任何需要的東西,或者,你以沒有(顯着)暴露給他們的方式來烘焙它。
  • 取一個日誌框架並將其添加到您的項目中,但只是作爲一個乾淨的依賴關係 - 而不是在代碼級別「烘烤」。例如,您可以使用MS EntLibs執行此操作,並通過提供默認配置(並在IntSTall進程中包含EntLib DLL),您可以成功屏蔽用戶無需執行任何操作。

儘管(盡我所見),底線是logging(config)通常是人們在某些時候需要弄的東西,因爲它通常是特定於環境的,所以我懷疑你可以屏蔽所有用戶從不必一直知道任何事情。

1

我剛碰到同樣的問題。我的庫只有78KB,但需要238KB的log4net依賴。所以我寫了一個抽象類動態加載log4net的,只有當存在這樣的:

static Logger() { 
     try { 
      Assembly.Load("log4net"); 
      _loggingIsOff = false; 
     } catch {} 
    } 

    public static ILog CreateLog() { 
     var frame = new System.Diagnostics.StackFrame(1, false); 
     var type = frame.GetMethod().DeclaringType; 
     return _loggingIsOff ? (ILog)new NoLog() : new Log4NetLogger(type); 
    } 
    ... 
} 

鏈接到完整的代碼here

0

你可能會考慮包括日誌庫有足夠廣泛分發許可,允許你將它與你的源代碼一起分發。大多數基於BSD的許可證將允許你這樣做。

我很有偏見,但http://www.logog.org可能會根據一些相當廣泛的許可條款重新分配,並且可能符合您的要求。