關於slf4j log4j log4j2的jar包配合使用的那些事


https://www.jianshu.com/p/d7b0e981868d

由於java日志框架眾多(common-logging,log4j,slf4j,logback等),引入jar包的時候,就要為其添加對應的日志實現。。

不同的jar包,可能用了不同的日志框架,那引用了之后就得給不同的日志框架添加配置,這個是比較麻煩的。

slf4j就是為了解決這個麻煩事的。

slf4j全稱為Simple Logging Facade for JAVA,java簡單日志門面。類似於Apache Common-Logging,是對不同日志框架提供的一個門面封裝,可以在部署的時候不修改任何配置即可接入一種日志實現方案。但是,他在編譯時靜態綁定真正的Log庫。使用SLF4J時,如果你需要使用某一種日志實現,那么你必須選擇正確的SLF4J的jar包的集合(各種橋接包)。

這個東西要用圖才能說得清楚,借用官網一張圖:

 
image.png

下載了slf4j的壓縮包后,這里下的版本是slf4j-1.7.25.zip,里面有很多jar文件。

slf4j的核心包是slf4j-api-1.7.25.jar,需要配合日志實現,才能將日志綁定另一種輸出。我們先看看slf4j里的jar包的作用.

jcl-over-slf4j.jar --> (jcl -> slf4j) 將Jakarta Commons Logging日志框架到 slf4j 的橋接 jul-to-slf4j.jar --> (juc -> slf4j) 將java.util.logging的日志橋接到 slf4j log4j-over-slf4j.jar--> (log4j -> slf4j) 將log4j 的日志,橋接到slf4j osgi-over-slf4j.jar --> (osgi -> slf4j) 將osgi環境下的日志,橋接到slf4j slf4j-android.jar --> (android-> slf4j) 將android環境下的日志,橋接到slf4j slf4j-api.jar --> slf4j 的api接口jar包 slf4j-ext.jar --> 擴展功能 slf4j-jcl.jar --> (lf4j -> jcl ) slf4j 轉接到 Jakarta Commons Logging日志輸出框架 slf4j-jdk14.jar --> (slf4j -> jul ) slf4j 轉接到 java.util.logging,所以這個包不能和jul-to-slf4j.jar同時用,否則會死循環!! slf4j-log4j12.jar --> (slf4j -> log4j) slf4j 轉接到 log4j,所以這個包不能和log4j-over-slf4j.jar同時用,否則會死循環!! slf4j-migrator.jar --> 一個GUI工具,支持將項目代碼中 JCL,log4j,java.util.logging的日志API轉換為slf4j的寫法 slf4j-nop.jar --> (slf4j -> null) slf4j的空接口輸出綁定,丟棄所有日志輸出 slf4j-simple.jar --> (slf4j -> slf4j-simple ) slf4j的自帶的簡單日志輸出接口 

這樣整理之后,slf4j的jar包用途就比較清晰了。
目前個人遇到的項目里,一般還會有log4j和log4j2混用的問題。
因為log4j項目已經停止更新了,官方建議用log4j2。
然后,log4j2里也提供了對各類log的橋接支持,這里就只列舉相關的幾個jar包說明。

log4j-1.2-api.jar --> (log4j -> log4j2) 將log4j 的日志轉接到log4j2日志框架 log4j-api.jar --> log4j2的api接口jar包 log4j-core.jar --> ( log4j2 -> log4j-core) log4j2的日志輸出核心jar包 log4j-slf4j-impl.jar--> (slf4j -> log4j2) slf4j 轉接到 log4j2 的日志輸出框架 (不能和 log4j-to-slf4j同時用) log4j-to-slf4j.jar --> ( log4j2 -> slf4j) 將 log4j2的日志橋接到 slf4j (不能和 log4j-slf4j-impl 同時用) 

從這里就已經可以看到,日志框架之間的關系有點亂。
因為log4j2和slf4j都能對接多種日志框架,所以這些包的依賴,作用,還有命名,都容易讓人混淆。

這里針對 log4j, log4j2, slf4j做一個簡單總結。

log4j

這個最簡單,單獨使用jar包就一個,已經停止更新,當前最新版是 log4j-1.2.17.jar
只有輸出功能,沒有轉接功能。
可以用

// PropertyConfigurator.configure("conf/log4j.properties"); // DOMConfigurator.configure("conf/log4j.xml"); 

來指定配置文件位置。

log4j2

同時有日志輸出和轉接功能。
單獨使用時,jar包是 log4j-api-2.x.x.jar 和 log4j-core-2.x.x.jar
如果配置文件不在src目錄,或者項目build Path 的source目錄下,可以用以下代碼指定配置文件位置:

String config = System.getProperty("user.dir");// 獲取程序的當前路徑 ConfigurationSource source = new ConfigurationSource( new FileInputStream(config + File.separator + "conf" + File.separator + "log4j2.xml")); Configurator.initialize(null, source); // 以下代碼是log4j已經加載配置的情況下,指定加載其他的配置 LoggerContext logContext = (LoggerContext) LogManager.getContext(false); File conFile = new File("conf/logs/log4j2.xml"); logContext.setConfigLocation(conFile.toURI()); logContext.reconfigure(); 

log4j -> log4j2 橋接

去掉 log4j 1.x jar,添加log4j-1.2-api.jar,配合 log4j-api-2.x.x.jar 和 log4j-core-2.x.x.jar 即可,依賴如下

log4j-1.2-api.jar
    log4j-api-2.x.x.jar
        log4j-core-2.x.x.jar

log4j2 -> log4j 橋接

不建議。
本來log4j在2015年停止更新后,就建議轉向log4j2,並提供了到log4j2的橋接接口。
所以反過來log4j2到log4j是不建議這么做的,log4j2也沒有提供直接支持。
但理清了上面的jar包作用,就會發現,可以通過 log4j2 -> slf4j -> log4j 的方式來實現。

需要的jar包,根據依賴關系分別是:

log4j-api-2.x.x.jar
    log4j-to-slf4j.jar
        slf4j-api-x.x.x.jar
            slf4j-log4j12-x.x.x.jar
                log4j-1.2.17.jar

slf4j

同時有日志輸出和轉接功能。
核心jar包是 slf4j-api-x.x.x.jar
因為一般slf4j 只作為橋接用,如果要搭配 slf4j 自帶的簡單日志輸出,那么就加上 slf4j-simple.jar

log4j -> slf4j

將代碼中的log4j日志橋接到 slf4j,需要如下jar包

log4j-over-slf4j-x.x.x.jar
    slf4j-api-x.x.x.jar

log4j2 -> slf4j

將代碼中的log4j2日志橋接到 slf4j,需要如下jar包

log4j-api-2.x.x.jar
    log4j-to-slf4j-2.x.x.jar
        slf4j-api-x.x.x.jar

slf4j -> log4j

將slf4j日志,采用log4j實現進行輸出,需要如下jar包

slf4j-api-x.x.x.jar
    slf4j-log4j12.jar
        log4j-1.2.17.jar

slf4j -> log4j2

將slf4j日志,采用log4j2實現進行輸出,需要如下jar包

slf4j-api-x.x.x.jar
    log4j-slf4j-impl.jar
        log4j-api.jar
            log4j-core.jar

slf4j的代理綁定和輸出組合起來,就實現了從一種日志框架,轉到另一種日志實現框架的效果。
建議在這三種日志混用的情況下,采用如下方案

log4j -> log4j2 slf4j -> log4j2


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM