前面介紹了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下,配置如下:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
<charset>utf-8</charset>
</encoder>
<file>log/output.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
<fileNamePattern>log/output.log.%i</fileNamePattern>
</rollingPolicy>
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<MaxFileSize>1MB</MaxFileSize>
</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。
練習
根據配置文件,觀察Logback寫入的日誌文件。
從下載練習:slf4j+logback (推薦使用IDE練習插件快速下載)
小結
SLF4J和Logback可以取代Commons Logging和Log4j;
始終使用SLF4J的接口寫入日誌,使用Logback只需要配置,不需要修改代碼。