java - example - slf4j教學




值得在一個額外的層包裝日誌框架? (4)

我目前正在考慮在一個大中型Java代碼庫中升級日誌機制。 消息當前使用Debug類中的靜態方法記錄,並且我建議從此切換到SLF4J或commons-logging之類的東西。

應用程序架構師傾向於封裝SLF4J的依賴關係(可能通過封裝在上述的Debug類中)。 這將使日後更改日誌記錄實現變得更容易。

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

另外一個本土的抽像中值得把SLF4J這樣的第三方日誌抽象包裹起來嗎?


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

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


我完全同意你的看法:包裝紙的包裝紙已經失控。 我懷疑,架構師並沒有意識到SLF4J如何能夠輕鬆地包裝任何其他的日誌系統,所以“改變實現”是完全可行的,沒有另一層包裝。


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

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

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


我想這個架構師希望封裝封裝(即SLF4J)的動機是將您的應用程序與SLF4J隔離。 很顯然,在應用程序中調用SLF4J API會創建對SLF4J的依賴關係。 但是,如下所述,重複應用隔離原則也同樣合理。 這讓我想起理查德·道金斯的問題:如果上帝創造了宇宙,那麼是誰創造了上帝?

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

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

這個主題也在SLF4J FAQ條目中提到。







apache-commons-logging