Java日誌那些事

日誌系統的發展

我們日常接觸到的日誌系統有很多種,log4j,JUL(jdk自帶),logback等,我們可以直接根據對象的日誌API進行使用。但是考慮到API各不相同,所以出現了JCL(Jakarta Commons Logging)、slf4j等日誌API框架。日誌API框架只是統一的API,其底層的具體的日誌記錄工作還是由log4j、JUL、logback等承擔。

如何選擇和搭配日誌系統

目前來說,新應用使用logback是首選,一些老系統中很可能使用的是log4j等。目前slf4j對logback和log4j都支持,對JCL也提供了橋接方法,將JCL的api轉化slf4j的API。貼一張Webx中的圖足以說明一切
圖片描述

組裝日誌系統

由於存在JCL,SLF4j兩大日誌框架,logback、log4j、JUL日誌系統所以理論上有這麼多種日誌系統的搭配。

  • JUL
  • log4j
  • logback
  • jcl+log4j
  • slf4j+slf4j-log4j12+log4j
  • slf4j+logback
  • jcl-over-slf4j+slf4j+logback
  • jcl-over-slf4j+slf4j+slf4j-log4j12+log4j

其中slf4j+slf4j-log4j12+log4j、slf4j+logback是主流,推薦使用。

多種日誌工具共存時的解決方案

當依賴了一些三方庫時,可能會出現多種日誌共存的問題,無法保證每種日誌抽象庫都使用一樣的實現類,此時需要制定固定的日誌庫。
主流的日誌庫都提供了擴展方式

JUL(java.util.logging)

通過LogManager.getLogManager().getLogger("").addHandler()方法,可以添加日誌具體實現
LogManager.getLogManager().getLogger("").addHandler(new SLF4JBridgeHandler());
繼承java.util.logging.Handler 類,在實現中使用具體的Logger庫即可
實現例子:
jul-to-slf4j(https://www.slf4j.org/api/org...

JCL(org.apache.commons.logging)j

通過制定環境變量LogFactory,org.apache.commons.logging.LogFactory
System.setProperty("org.apache.commons.logging.LogFactory","com.answern.claimv2.framework.log.LogFactoryImplAdapter");
繼承org.apache.commons.logging.LogFactory類,實現自己的LogFactory即可
還有另外一種暴力的方式:
不引入commons-logging包,而是創建jcl的一些同名類,在實現中直接使用具體的日誌庫。jcl-over-slf4j(https://mvnrepository.com/art...)就是一個典型的例子.
相同功能的還有spring-jcl(https://mvnrepository.com/art...

log4j

log4j提供了java對原生spi機制的支持
建立MEATA-INF/services/org.apache.logging.log4j.spi.Provider文件
繼承org.apache.logging.log4j.spi.Provider類,實現自己的LoggerContextFactory即可
實現例子:
log4j-to-slf4j(https://logging.apache.org/lo...

SLFJ4J

slf4j官方介紹了使用方式,通過引入不同的jar包來使用具體的日誌庫。
由於slf4j拆分做的很好,當多種日誌庫共存時,若不引入slf4j-xxx.jar時,不會加載相應的日誌庫。
所以若日誌衝突時,使用slf4j的三方庫只需要include/exclude相應的實現庫即可。
concrete-bindings.png

編寫自己的框架/類庫時該如何選擇日誌庫

由於日誌庫多種多樣,如果盲目引入jcl或者slf4j時,可能會對具體使用的項目造成影響。所以最合適的方式是內嵌一套日誌抽象,內部動態的去選擇加載哪個日誌庫。主流的成熟框架都會這麼做,儘可能的保持兼容性。

例如spring/mybatis/freemarker/dubbo這些框架,都有一套內嵌的日誌抽象,打印日誌時只需要調用內嵌的日誌即可做到全兼容。

參考

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章