2009-06-10 109 views
20

我目前正在尋找升級大中型Java代碼庫中的日誌記錄機制。消息當前使用靜態方法在Debug類中記錄,並且我建議從此切換到SLF4J或commons-logging之類的東西。是否值得在附加層中包裝日誌框架?

應用程序架構師更喜歡將封裝在SLF4J上的依賴關係(可能通過將其包裝在上述的Debug類中)。這將使日後更易於更改日誌記錄實施。

這對我來說似乎有點矯枉過正,因爲SLF4J已經在抽象具體的日誌實現。

是否值得包裝的另一土生土長的抽象第三方日誌抽象像SLF4J?

+2

建築師還沒有理解slf4j是什麼。 – 2013-06-02 08:51:03

回答

22

我完全同意你的看法:包裝紙的包裝紙已經失控。我懷疑這位架構師並沒有意識到SLF4J如何能夠輕鬆包裝任何其他的日誌系統,因此,「改變實現」是完全可行的,而不需要另外一層包裝。

+8

確實。我只能預見到爲什麼我們需要從SLF4J切換到兩個可能的原因:SLF4J變得完全滅絕,或者有人發明了一種全新的日誌記錄方式,這與現在每個人的做法完全不同。兩者似乎都不太可能:) – harto 2009-06-12 05:09:29

+1

@ harto的評論+1,因爲它是如此完美的聲音! - ) – 2009-06-12 05:55:24

+0

我猜想架構師並沒有真正嘗試slf4j,並沒有意識到它是API,而不是實現。 – 2016-08-26 09:48:16

0

如果您在考慮將來切換Logging框架,可能需要在可以切換記錄器的位置添加一個額外的圖層。否則,如果他們提供了你可能需要的所有東西(當然使用你的水晶球),那麼可能很難依賴這個框架。

如果您當前的設置允許靈活地更改,則不需要包裝。

4

向您的Architecture Astronaut解釋slf4j已經可以充當其他日誌實現的包裝,如log4j。因此,如果將來需要使用其他一些記錄器,並且沒有適配器用於slf4j,那麼可以在需要時編寫它,但它只是適配器,而不是編寫一個只會包裝其他一些的其他記錄框架日誌框架,你需要設計你的框架並編寫你自己的適配器。

8

我寧願把它包起來,但不是因爲陳述的原因。如果擔心是換出另一個框架的能力,可以使用java.util.logging或SLF(java.util.logging不像封裝器那樣容易使用,但它非常可行),並且交換掉。使用(又一個)包裝器的原因是在代碼中編寫合適的日誌記錄方式。通常,應用程序需要一個子集,例如所有系統錯誤都帶有例外情況,或者有關何時使用標準日誌記錄級別的具體指導。這些決定可以封裝在幾個方法中,在大代碼基礎上創建更一致的日誌記錄決策。

但是,如果動機只是爲了實現交換實現,不要重新發明輪子。 SLF是完美的工作,只是使用它。

有一個例外。如果您的代碼無意中被部署到許多可能的應用程序服務器中,那麼您必須確保您的日誌選擇不會與任何框架正在使用的潛在舊版本或更新版本衝突。

4

與每一個包裝的問題是你如何會真正包裹,你會提供功能性的決定:

  • commons.logging是提供一組最小的日誌記錄功能,藏起來了額外的功能,底層框架可能會提供。您不會獲得像參數化日誌記錄或MDC這樣的高級功能。
  • SLF4J反過來工作。它通過在沒有實現它們的框架之上實現它們來處理參數化日誌等高級功能。這是更好的方法,恕我直言。

我不知道你當前的調試類,但我想這是非常基本的。

你可能不會有功能,如

  • 日誌消息的位置,即源文件+行號的名稱
  • 不同的日誌記錄級別
  • 的能力來選擇性地設置水平不同的記錄器,即你沒有一個記錄器每個類,有能力設置記錄器到一定程度的興趣,例如INFO,WARN。這非常重要。

如果您的Debug類非常基本的其實這是非常好的適合你:)

這意味着你可能能夠通過執行全局搜索& destr切換到SLF4J。 .. err ...取代。

創建備份,但...;)

Should new projects use logback instead of log4j?What’s Up with Logging in Java?Which log4j facade to choose?Find a way in the java logging frameworks scene.Do you find java.util.logging sufficient?見。 (擾流板:你不應該使用的java.util.logging,拜託)

10

我想建築師的慾望包裹包裝(即SLF4J)背後的動機,是爲了隔離SLF4J您的應用程序。很明顯,從應用程序中調用SLF4J API會創建對SLF4J的依賴關係。但是,如下所述,重複應用隔離原則也同樣合理。它讓我想起理查德道金斯的問題:如果上帝創造了宇宙,那麼誰創造了上帝?

事實上,你也可以在包裝SLF4J的包裝上應用隔離原則。如果SLF4J包裝比SLF4J差一些,那麼隔離的原因就不合適了。雖然可能,但是包裝等於或超過原始包裝是相當罕見的。可以引用SWT作爲一個值得注意的反例。但是,SWT是一個相當大的項目,成本很高。更重要的是,SLF4J-wrapper的定義依賴於SLF4J。它必然具有相同的通用API。如果將來會出現一個新的,截然不同的日誌API,那麼使用包裝器的代碼將很難直接作爲使用SLF4J的代碼遷移到新的API。因此,包裝不太可能驗證您的代碼,但通過添加額外的間接方法使其更重。

總之,即使你沒有更好的做法,你也不應該浪費時間來包裝SLF4J,因爲你的包裝的附加價值保證接近於零。

該主題也在SLF4J FAQ entry中提出。