2012-12-19 42 views
3

假設有一個應用程序,它使用log4j直接,即i。即沒有slf4j或任何其他包裝。現在我想用logback替換log4j。我應該使用slf4j(或任何其他包裝)?什麼被認爲是「良好做法」?我應該使用slf4j作爲logback的包裝嗎?

+2

當你在一年內從logback移動到xxx時,如果你使用了slf4j,它會使改變的痛苦減少。 – assylias

+1

slf4j不是logback的包裝,因爲logback是用slf4j-api實現的。 – Ceki

回答

4

你肯定應該使用SLF4J API,如果你以後決定回去log4j的或別的東西,你只需要改變SLF4J橋,和你的應用程序日誌代碼將不修改工作。另外,如果您訪問http://www.slf4j.org/,您會看到slf4j將Logback視爲其本地實現,而Logback實際上本地實現了SLF4J API。

1

您可以用更改代碼在所有的遷移,使用log4j-over-slf4j.jar,而不是「真實」 Log4J的一個。這爲它的客戶端提供了與Log4J相同的API,但是將日誌記錄調用指向SLF4J,SLF4J又可以將它們發送到logback。

但是,如果您有修改代碼的選項,那麼我會建議將其更改爲使用SLF4J,然後您可以根據需要交換任何後端(logback,log4j等)。有一件事你不能做的是嘗試,並與Log4J的後端結合log4j-over-slf4j ...

1

有一個很好的理由使用SLF4J API,無論實際採伐後端,即

log.debug("Foo: {}, Bar: {}", foo, bar); 

參數構造。 Log4j總是需要一個完整的字符串來記錄,這就是爲什麼您需要圍繞if s來查看是否爲昂貴的字符串啓用了語句。在進行檢查之前,SLF4J不會調用foo.toString()或bar.toString(),所以禁用的調用很便宜。

因此,我建議您遷移源SLF4J並使用相應的橋在SLF4J下載使用log4j的作爲後端。這將使您可以像現在這樣繼續進行,無需進一步更改。如果需要,您可以將後端切換回登錄。

2

正如Evgeniy Dorofeev所提到的,logback本地實現了slf4j-api。這意味着通過slf4j-api(即通過org.slf4j.Logger的實例)調用logback記錄器完全沒有開銷。您可以直接調用類型爲ch.qos.logback.classic.Logger而不是org.slf4j.Logger的記錄器,但這樣做不會提供任何優勢,但如果您選擇這樣做,可能會使其難以遷移到其他日誌記錄框架。

順便說一句,slf4j不是包裝作爲logback是用slf4j-api來實現的。

爲了便於遷移到SLF4J,對於migrating source code to slf4j的工具。對於你無法修改的代碼,log4j,java.util.logging和commons-logging都有bridges

相關問題