前面介绍了Commons Logging
和Log4j
这一对好基友,它们一个负责充当日志 API,一个负责实现日志底层,搭配使用非常便于开发。
有的童鞋可能还听说过SLF4J
和Logback
。这两个东东看上去也像日志,它们又是啥?
其实SLF4J
类似于Commons Logging
,也是一个日志接口,而Logback
类似于Log4j
,是一个日志的实现。
为什么有了Commons Logging
和Log4j
,又会蹦出来SLF4J
和Logback
?这是因为Java有着非常悠久的开源历史,不但OpenJDK
本身是开源的,而且我们用到的第三方库,几乎全部都是开源的。开源生态丰富的一个特定就是,同一个功能,可以找到若干种互相竞争的开源库。
因为对Commons Logging
的接口不满意,有人就搞了SLF4J
。因为对Log4j
的性能不满意,有人就搞了Logback
。
我们先来看看SLF4J
对Commons Logging
的接口有何改进。在Commons Logging
中,我们要打印日志,有时候得这么写:
int score = 99;
p.setScore(score);
log.info("Set score " + score + " for Person " + p.getName() + " ok.");
拼字符串是一个非常麻烦的事情,所以SLF4J的日志接口改进成这样了:
int score = 99;
p.setScore(score);
logger.info("Set score {} for Person {} ok.", score, p.getName());
我们靠猜也能猜出来,SLF4J
的日志接口传入的是一个带占位符的字符串,用后面的变量自动替换占位符,所以看起来更加自然。
如何使用SLF4J
?它的接口实际上和Commons Logging
几乎一模一样:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
class Main {
final Logger logger = LoggerFactory.getLogger(getClass());
}
对比一下Commons Logging
和SLF4J
的接口:
Commons Logging SLF4J
org.apache.commons.logging.Log org.slf4j.Logger
org.apache.commons.logging.LogFactory org.slf4j.LoggerFactory
不同之处就是Log
变成了Logger
,LogFactory
变成了LoggerFactory
。
使用SLF4J
和Logback
和前面讲到的使用Commons Logging
加Log4j
是类似的,先分别下载SLF4J
和Logback
,然后把以下jar包放到classpath下:
slf4j-api-1.7.x.jar
logback-classic-1.2.x.jar
logback-core-1.2.x.jar
然后使用SLF4J的Logger和LoggerFactory即可。和Log4j类似,我们仍然需要一个Logback的配置文件,把logback.xml放到classpath下,配置如下:
<configuration>
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%npattern>
encoder>
appender>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%npattern>
<charset>utf-8charset>
encoder>
<file>log/output.logfile>
<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
<fileNamePattern>log/output.log.%ifileNamePattern>
rollingPolicy>
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<MaxFileSize>1MBMaxFileSize>
triggeringPolicy>
appender>
<root level="INFO">
<appender-ref ref="CONSOLE" />
<appender-ref ref="FILE" />
root>
configuration>
运行即可获得类似如下的输出:
13:15:25.328 [main] INFO com.itranswarp.learnjava.Main - Start process...
从目前的趋势来看,越来越多的开源项目从Commons Logging加Log4j转向了SLF4J加Logback。
SLF4J
和 Logback
可以取代Commons Logging
和Log4j
;
始终使用SLF4J
的接口写入日志,使用Logback
只需要配置,不需要修改代码。