使用slf4j庫(kù)作為你的Java應(yīng)用日志API層有很多好處,這里我會(huì)展示一小部分關(guān)于如何使用和配置它的例子阔籽。
你可以把slf4j想成一個(gè)Java的接口匪补,然后你需要實(shí)現(xiàn)這個(gè)接口,從而在運(yùn)行時(shí)提供實(shí)際的日志記錄染簇,例如把日志寫到控制臺(tái)(STDOUT)或者一個(gè)文件上等等对室。每種實(shí)現(xiàn)(或成為綁定)都顯而易見(jiàn)地有他們自己的方式來(lái)配置日志的輸出模燥,但是你的應(yīng)用對(duì)實(shí)現(xiàn)者并無(wú)感知并且一直使用相同的org.slf4j.Logger API。讓我們看看如何在實(shí)際中使用它掩宜。
使用slf4j做簡(jiǎn)單的日志記錄
創(chuàng)建基于Maven的工程蔫骂,在pom.xml中添加如下內(nèi)容
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.5</version>
</dependency>
現(xiàn)在你可以在你的Java代碼中這樣使用Logger
package deng;
import org.slf4j.*;
public class Hello {
static Logger LOGGER = LoggerFactory.getLogger(Hello.class);
public static void main(String[] args) {
for (int i = 0; i < 10; i++)
if (i % 2 == 0)
LOGGER.info("Hello {}", i);
else
LOGGER.debug("I am on index {}", i);
}
}
以上代碼可以編譯通過(guò),但是當(dāng)你運(yùn)行它時(shí)牺汤,你會(huì)看到這樣的輸出
bash> java deng.Hello
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
上面的意思是辽旋,在運(yùn)行時(shí),你沒(méi)有做日志的實(shí)現(xiàn)(或者說(shuō)日志的綁定)檐迟,所以slf4j簡(jiǎn)簡(jiǎn)單單的使用了一個(gè)什么也不會(huì)做的空實(shí)現(xiàn)补胚。
為了看到正確的輸出,你應(yīng)該嘗試使用一個(gè)簡(jiǎn)單(simple)的實(shí)現(xiàn)追迟,這個(gè)實(shí)現(xiàn)根本不需要任何配置糖儡!只要回到pom.xml然后添加如下配置
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.7.5</version>
</dependency>
現(xiàn)在你可以在控制臺(tái)(STDOUT)看見(jiàn)INFO級(jí)別的日志輸出了。這個(gè)簡(jiǎn)單的logger會(huì)默認(rèn)顯示任何INFO或者更高級(jí)別的信息怔匣。想要看DEBUG級(jí)別的信息,你需要在Java啟動(dòng)時(shí)傳入這個(gè)系統(tǒng)屬性(system property)
-Dorg.slf4j.simpleLogger.defaultLogLevel=DEBUG
使用slf4j與Log4j日志
現(xiàn)在我們可以試驗(yàn)并更換不同的日志實(shí)現(xiàn)桦沉,但你的程序代碼可以保持不變每瞒。
我們要做的是用另一個(gè)流行的日志實(shí)現(xiàn)來(lái)替換掉slf4j-simple,比如Log4j纯露。
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.5</version>
</dependency>
又一次剿骨,我們必須對(duì)我們選的每一個(gè)日志實(shí)現(xiàn)做配置。在這個(gè)例子中埠褪,我們需要一個(gè)文件src/main/resources/log4j.properties浓利。
log4j.rootLogger=DEBUG, STDOUT
log4j.logger.deng=INFO
log4j.appender.STDOUT=org.apache.log4j.ConsoleAppender
log4j.appender.STDOUT.layout=org.apache.log4j.PatternLayout
log4j.appender.STDOUT.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n
重運(yùn)行你的程序挤庇,你會(huì)看到同樣的輸出結(jié)果。
使用slf4j和JDK日志
JDK實(shí)際上帶有一個(gè)日志包贷掖,你可以在pom.xml中替換為另一個(gè)日志實(shí)現(xiàn)嫡秕。
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-jdk14</artifactId>
<version>1.7.5</version>
</dependency>
現(xiàn)在JDK日志的配置起來(lái)有一點(diǎn)困難。這里不僅需要一個(gè)配置文件src/main/resources/logging.properties苹威,你還需要添加一個(gè)系統(tǒng)屬性
-Djava.util.logging.config.file=logging.properties
這是一個(gè)logging.properties的示例
level=INFO
handlers=java.util.logging.ConsoleHandler
java.util.logging.ConsoleHandler.level=FINEST
deng.level=FINEST
使用slf4j和Logback日志
Logback日志實(shí)現(xiàn)是一個(gè)高質(zhì)量的實(shí)現(xiàn)昆咽。如果你想在項(xiàng)目中寫認(rèn)真的代碼,你會(huì)想要考慮這中方式牙甫。還是修改你的pom.xml文件掷酗,替換成這樣
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.0.13</version>
</dependency>
這是一個(gè)簡(jiǎn)單的配置src/main/resources/logback.xml
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<logger name="deng" level="DEBUG"/>
<root level="INFO">
<appender-ref ref="STDOUT" />
</root>
</configuration>
用slf4j寫你自己的日志庫(kù)
如果你正在很多終端用戶(END USER)提供Java庫(kù),那么讓你的項(xiàng)目?jī)H依賴slf4j-api絕對(duì)是個(gè)好想法窟哺,然后讓你的用戶在他們開(kāi)發(fā)和運(yùn)營(yíng)環(huán)境中選擇任意的日志實(shí)現(xiàn)泻轰。作為終端用戶,他們可以快速地從上面提到的日志庫(kù)中選擇一個(gè)且轨,并且從他們自己喜歡的日志實(shí)現(xiàn)的特性中受益浮声。
翻譯自: How to Configure SLF4J with Different Logger Implementations