一、概念
SLF4J的全称是Simple Logging Facade for Java,即简单日志门面。SLF4J并不是具体的日志框架,而是作为一个简单门面服务于各类日志框架,如java.util.logging, logback和log4j。
SLF4J提供了统一的记录日志的接口,对不同日志系统的具体实现进行了抽象化,只要按照其提供的方法记录即可,最终日志的格式、记录级别、输出方式等通过绑定具体的日志系统来实现。
使用SLF4J的好处在于,你只需要按统一的方式写记录日志的代码,如:
public class LoggerTest {
private static final Logger logger = LoggerFactory.getLogger(Tester.class);
public static void main(String[] args) {
logger.info("Current Time: {}", System.currentTimeMillis());
}
}
SLF4J支持{}
作为占位符,等价于C语言中的%s
,而不必再进行字符串的拼接,效率有显著的提升(见后面运行结果)。
而无需关心日志是通过哪个日志系统,以什么风格输出的。因为它们取决于部署项目时绑定的日志系统。
例如,在项目中使用了SLF4J记录日志,并且绑定了log4j,则日志会以log4j的风格输出;后期需要改为以logback的风格输出日志,只需要将log4j替换成logback即可,不用修改项目中的代码。
二、步骤
1. 在Maven的porn.xml 文件中添加dependency如下(也可手动引入下述的三个包)
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.2</version>
</dependency>
之后就会添加三个包 slf4j-api-1.6.1.jar、slf4j-log4j12-1.7.2.jar、log4j-1.2.17.jar
2. 之后在项目下添加log4j.properties
#config root logger
log4j.rootLogger = INFO,system.out
log4j.appender.system.out=org.apache.log4j.ConsoleAppender
log4j.appender.system.out.layout=org.apache.log4j.PatternLayout
log4j.appender.system.out.layout.ConversionPattern=MINAServer Logger-->%5p{%F:%L}-%m%n
#config this Project.file logger
log4j.logger.thisProject.file=INFO,thisProject.file.out
log4j.appender.thisProject.file.out=org.apache.log4j.DailyRollingFileAppender
log4j.appender.thisProject.file.out.File=logContentFile.log
log4j.appender.thisProject.file.out.layout=org.apache.log4j.PatternLayout
3. 在代码中添加
private static final Logger logger = LoggerFactory.getLogger(MINAServer.class);
如果要输出到文件系统
1 log4j.rootLogger=INFO,R,stdout
2
3 log4j.appender.stdout=org.apache.log4j.ConsoleAppender
4 log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
5 log4j.appender.stdout.layout.ConversionPattern=Logger-->%5p{%F:%L}-%m%n
6
7 log4j.appender.R=org.apache.log4j.DailyRollingFileAppender
8 log4j.appender.R.File=../logs/log
9 log4j.appender.R.layout=org.apache.log4j.PatternLayout
10 log4j.appender.R.layout.ConversionPattern=Logger-->%5p{%F:%L}-%m%n
每天产生一个log的配置方法:
log4j.rootLogger=DEBUG,DAILY_FILE
log4j.appender.DAILY_FILE=org.apache.log4j.DailyRollingFileAppender
log4j.appender.DAILY_FILE.file=${user.home}/logs/logging.log4j
log4j.appender.DAILY_FILE.DatePattern='_'yyyy-MM-dd'.log'
log4j.appender.DAILY_FILE.ImmediateFlush=true
log4j.appender.DAILY_FILE.Append=true
log4j.appender.DAILY_FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.DAILY_FILE.layout.ConversionPattern=%d %5p [%t] (%F:%L) - %m%n
三、更换日志系统
看到这里,你可能会有疑问:既然都用了log4j,为什么还要用SLF4J来写记录日志的代码呢,不是多此一举吗?
答案是否定的。假设我们不再需要log4j,而是希望改为使用java自带logging记录日志,我们需要做的仅仅是将pom.xml的依赖项slf4j-log4j12
改为slf4j-jdk14
即可,无需对上述测试代码做任何修改。
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-jdk14</artifactId>
<version>1.8.0-alpha2</version>
</dependency>
是的,就是这么简单。再次运行测试代码:
六月 16, 2017 10:32:30 下午 com.jiapengcs.demos.slf4j.LoggerTest main
信息: Current Time: 1497623550843
六月 16, 2017 10:32:30 下午 com.jiapengcs.demos.slf4j.LoggerTest main
信息: Current Time: 1497623550874
六月 16, 2017 10:32:30 下午 com.jiapengcs.demos.slf4j.LoggerTest main
信息: Current Time: 1497623550875
六月 16, 2017 10:32:30 下午 com.jiapengcs.demos.slf4j.LoggerTest main
警告: warn log
六月 16, 2017 10:32:30 下午 com.jiapengcs.demos.slf4j.LoggerTest main
信息: info log
六月 16, 2017 10:32:30 下午 com.jiapengcs.demos.slf4j.LoggerTest main
严重: error log
我们发现,此时日志已经变为以logging的方式输出。
四、总结
SLF4J的使用非常简单,甚至连官网上都说鉴于它太轻量,文档篇幅不长。
在《阿里巴巴Java开发手册(正式版)》中,日志规约一项第一条就强制要求使用SLF4J。
所以从现在开始使用SLF4J吧!
本文示例源代码项目地址:https://gitee.com/fairy1674/Demo-Project/tree/master/mvn-test