SLF4J: No SLF4J providers were found.

1.解決SLF4J報錯

大家經(jīng)常碰到,在自己的項目中使用了SLF4J,或者引入了某開源項目時,運行時會報如下的錯誤:

SLF4J: No SLF4J providers were found.
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See SLF4J Error Codes for further details.

檢查自己的classpath,發(fā)現(xiàn)已經(jīng)引入了slf4j-api-xx.jar了,這是為什么呢?其原因是,SLF4J本身不是一個日志庫,而是一個日志庫的抽象層,它必須依賴底層的日志庫,看SLF4J官網(wǎng)上的這張圖:



從圖中可知,SLF4J必須和其他日志庫配合才能正常運行。因此一般來說,需要將抽象層(例如slf4j-api-xx.jar)+中間層(例如slf4j-log4j12)+實現(xiàn)層(例如log4j)這三層都配置好才能保證SLF4J正常運行。

另外,有的日志庫可以去掉中間層,例如slf4j-api和slf4j-simple就可以直接配合

2.SLF4J和slf4j-simple的配合使用

這種方式就是抽象層+實現(xiàn)層的組合。使用這種方式只需要以下兩個jar包:

slf4j-api-1.8.0-beta0.jar
slf4j-simple-1.8.0-beta0.jar
并將這兩個jar包加入classpath,或者使用maven:

<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-api</artifactId>
  <version>1.8.0-beta0</version>
</dependency>
 
<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-simple</artifactId>
  <version>1.8.0-beta0</version>
</dependency>

寫一段代碼測試一下:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
 
public class HelloWorld {
    public static void main(String[] args) {
        Logger logger = LoggerFactory.getLogger(HelloWorld.class);
        logger.info("Hello World");
    }
}

3.SLF4J和Log4j的配合使用

這種方式就是抽象層+中間層+實現(xiàn)層的組合,需要三個jar包:

  • slf4j-api-1.8.0-beta0.jar
  • slf4j-log4j12-1.8.0-beta0.jar
  • log4j-1.2.17.jar

其中抽象層和中間層的版本號是一致的,都是1.8.0-beta0,而log4j的版本號則要去Search/Browse/Explore上搜索,搜索版本是先搜索slf4j-log4j12-1.8.0-beta0.jar,然后看它的依賴項,查到其中l(wèi)og4j的版本號是1.2.17。

并將這三個jar包加入classpath,或者使用maven:

<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-api</artifactId>
  <version>1.8.0-beta0</version>
</dependency>
<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-log4j12</artifactId>
  <version>1.8.0-beta0</version>
</dependency>
<dependency>
  <groupId>log4j</groupId>
  <artifactId>log4j</artifactId>
  <version>1.2.17</version>
</dependency>

依然使用上面的代碼測試,發(fā)現(xiàn)SLF4J的報錯不存在了,但是出現(xiàn)了新的報錯如下:

log4j:WARN No appenders could be found for logger (.HelloWorld).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See Frequently Asked Technical Questions for more info.

這說明SLF4J已經(jīng)配置好了,但是Log4j的配置還有問題。

4.解決Log4j的報錯

Log4j的這個報錯也是非常常見的,在直接使用Log4j時也會出現(xiàn),在
No appenders could be found for logger(log4j)?
此處詳細介紹了如何解決這個錯誤,有兩種方法來解決。
第一種,在main函數(shù)中加入一行代碼:BasicConfigurator.configure();
經(jīng)測試有效。但是這樣的話源代碼中就必須顯式的加入Log4j的包,這樣SLF4J失去了作為抽象層的抽象作用。
第二種,添加一個配置文件log4j.properties,內(nèi)容如下(內(nèi)容可以自定義):

# Set root logger level to DEBUG and its only appender to A1.
log4j.rootLogger=DEBUG, A1
 
# A1 is set to be a ConsoleAppender.
log4j.appender.A1=org.apache.log4j.ConsoleAppender
 
# A1 uses PatternLayout.
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n

將此文件放到classpath中。此外,關于log4j.properties的路徑問題網(wǎng)上還有眾多討論。

5.小結

SLF4J是一個日志抽象庫,在眾多開源軟件包中被廣泛使用。由于它經(jīng)常被誤解為一個日志實現(xiàn)庫,尤其是與其他日志實現(xiàn)庫配合使用時,常常會報錯,缺少中間層的jar包,因此有必要將它的配置方法記錄一下。

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • SLF4J用戶手冊 Simple Logging Facade for Java(SLF4J)用作各種日志框架的簡...
    程序員文集閱讀 1,976評論 0 1
  • 每一個Java程序員都知道日志對于任何一個Java應用程序,尤其是服務端程序是至關重要的,而很多程序員也已經(jīng)熟悉各...
    七弦桐語閱讀 17,995評論 0 12
  • log4j, log4j2, slf4j, logback關系 log4j是由Apache開發(fā)的一套元老級日志框架...
    rainybowe閱讀 1,772評論 0 4
  • 問題 在項目啟動時,發(fā)現(xiàn)打印了大量的debug日志,但是src/main/resources下明明有l(wèi)og4j.x...
    Mr胡桃閱讀 22,746評論 2 11
  • 八年級網(wǎng)絡教研展示課已落下了帷幕。回顧這一學期來的工作和為展示課所作的準備,我從剛開始的質(zhì)疑不理解到后來的逐漸接受...
    日天昊閱讀 1,267評論 0 0

友情鏈接更多精彩內(nèi)容