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就会在使用时,将其转化为对应的具体框架的实现了
网友评论