使用SLF4J和Logback

前面介紹了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 LoggingSLF4J
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是類似的,先分別下載SLF4JLogback,然後把以下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只需要配置,不需要修改代碼。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章