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包,因此有必要將它的配置方法記錄一下。