SLF4j整合Log4J
前言
最近翻看了阿里巴巴Java開發者手冊,發現其中有一點提到了不要在應用中直接使用具體的日志框架,而推薦使用SLF4j框架,然后提供所需要的對應的日志框架的實現即可,一開始沒怎么理解這一點。后來查看了一下才明白,SLF4j框架提供的僅僅是抽象的API接口,并沒有綁定具體的實現,使用這種組合方式的優點在于,避開了應用綁定具體的日志框架,在某些時候,可能需要切換不同的日志框架,如果直接綁定了某一個框架,比如Log4j2,那修改起來就會非常麻煩了,而直接使用SLF4j框架,只需要根據需要提供對應的實現即可。
SLF4j整合Log4j
首先需要添加對應的依賴,如下所示
<!-- log4j2 -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.8.2</version>
</dependency>
<!-- log4j-slf4j實現,此依賴非常重要-->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>2.8.2</version>
</dependency>
這里需要注意的是,使用的時候需要提供的實現是log4j-slf4j-impl
而不是slf4j-log4j12
,非常重要,不能用錯
然后在類路徑提供log4j2的配置文件,這里僅僅給出最簡單的配置log4j2.xml
<?xml version="1.0" encoding="UTF-8" ?>
<Configuration status="WARN">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [ %-5p ] ( %l ) - %m%n"></PatternLayout>
</Console>
</Appenders>
<Loggers>
<root level="WARN">
<appender-ref ref="Console"/>
</root>
</Loggers>
</Configuration>
在編碼中,使用slf4j提供的API,而不再是log4j所提供的API
// 這里需要注意的是,導入的是slf4j包下的logger類
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Created by Huanfeng.Xu on 2017-06-24.
*/
public class TestLog4J {
private static final Logger logger = LoggerFactory.getLogger(TestLog4J.class);
public static void main(String[] args) {
logger.info("test Info");
logger.warn("test warning");
logger.error("test error");
logger.error("Current : {}", TestLog4J.class);
}
}
總結
在應用中直接綁定具體的日志框架,從某種意義上來說,這種做法是有缺陷的,在不同的場合可能需要不同的日志框架,而一旦綁定了具體的框架,在需要更改的時候就比較頭疼了,slf4j提供了一種比較好的方式,只需要使用slf4j提供的接口,并且為slf4j提供所要具體使用的日志框架的綁定,那么slf4j就會在使用時,將其轉化為對應的具體框架的實現了