2020/3/1

Java常見日誌框架比較(SLF4J、Log4J、Log4J2、logback)



  • 概要
    1. 日誌框架歷史?
    2. 門面日誌框架 VS 具體實現日誌框架?
    3. SLF4J應用之設計模式?
    4. 遺留問題 : 各第三方框架採用的日製框架不同 , 如何統一日誌框架?
    5. Spring Boot日誌框架配置?
  • 日誌框架歷史?

  • 門面日誌框架
    為了讓接口與具體實現抽離,因此誕生了門面日誌框架,常見框架如下
    • Jarkarta Common Logging
      • 運行時動態綁定Log實現類
      • 缺點 : 多ClassLoader導致的問題 , 2014年已停止維護
    • SLF4J(Simple Logging Facade for Java)
      • 編譯時綁定Log實現類
      • 實現了項目與具體日誌框架解耦.統一了各種日誌框架的使用方法,降低重複的學習成本
      • SLF4J範例
        • 僅載入slf4j jar包
        • spring boot專案預設使用logback包,欲更換可進行排除
        • spring boot <=1.3 版本支援log4j 
        • spring boot >=1.4 版本支援log4j2
        • 執行slf4j程式與結果
          slf4j因找不到具體日誌框架實作類,拋出錯誤
        • org/slf4j/impl/StaticLoggerBinder.class會尋找所有SLF4J的實現類

      •  Log4J實現
        • 增加轉接包
        • 實現org/slf4j/impl/StaticLoggerBinder.class與log4j
      • Log4J2實現
        • 增加轉接包 
        • 實現org/slf4j/impl/StaticLoggerBinder.class與log4j2
      • 如果上述兩項接引用JAR包 , 系統會提示找到多個實現類、使用了哪一個JAR包

  • SLF4J應用之設計模式?
    • Facade模式
      • 外部一系统的通信必須通過一個統一的入口進行,使得子系统更易于使用
        • 用在自定義utils?
        • Netflix Zuul?  Spring Cloud Getwate?
          • Netflix 的閘道方案使用 Zuul,雖然最新版本是 Zuul 2,不過 Spring Cloud 整合的版本僅 Zuul 1,這中間的插曲是 Zuul 2 原本預計在 2016 年底左右發佈,然而卻拖到了 2018 年 4 月,在這段期間,Spring 就自己搞了個 Spring Cloud Gateway,不打算整合 Zuul 2 了
      • SLF4J提共了統一接口 , 使用者無需關心具體實現方式
    • Adapter模式
      • 如同轉接頭 , 將兩者功能能配合在一起使用
      • 例如 , 因為在Log4J的發展歷史較早 , Log4J1並未考慮到後來出現的SLF4J , 因此SLF4J提共許多Adapter包 , 能夠與Log4J配合 
  • 遺留問題 : 各第三方框架採用的日誌框架不同 , 如何統一日誌框架?
    • 情境如下
    • 現況調整前 , 多個設定檔,各別輸出
    • 調整後 , 統一設定、輸出
  • 另一圖片解釋

  • Spring Boot預設日誌配置?
    • 僅載入 spring-boot-starter的情形下
    • 使用 IntellJ 在pom.xml上按下右鍵開啟 Diamgram->Dependcy
    • 可察看到 , 官方預設使用了sslf4j+logback作為日誌框架實現 
    • 還加入其他日誌框架橋接包, 替換成slf4j , 依情形僅需排除第三庫依賴的日誌依賴,spring boot自動幫你配置起來

    test2