使用slf4j庫作為你的Java應用日志API層有很多好處,這里我會展示一小部分關于如何使用和配置它的例子。
你可以把slf4j想成一個Java的接口,然后你需要實現這個接口,從而在運行時提供實際的日志記錄,例如把日志寫到控制臺(STDOUT)或者一個文件上等等。每種實現(或成為綁定)都顯而易見地有他們自己的方式來配置日志的輸出,但是你的應用對實現者并無感知并且一直使用相同的org.slf4j.Logger API。讓我們看看如何在實際中使用它。
使用slf4j做簡單的日志記錄
創建基于Maven的工程,在pom.xml中添加如下內容
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.5</version>
</dependency>
現在你可以在你的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);
}
}
以上代碼可以編譯通過,但是當你運行它時,你會看到這樣的輸出
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.
上面的意思是,在運行時,你沒有做日志的實現(或者說日志的綁定),所以slf4j簡簡單單的使用了一個什么也不會做的空實現。
為了看到正確的輸出,你應該嘗試使用一個簡單(simple)的實現,這個實現根本不需要任何配置!只要回到pom.xml然后添加如下配置
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.7.5</version>
</dependency>
現在你可以在控制臺(STDOUT)看見INFO級別的日志輸出了。這個簡單的logger會默認顯示任何INFO或者更高級別的信息。想要看DEBUG級別的信息,你需要在Java啟動時傳入這個系統屬性(system property)
-Dorg.slf4j.simpleLogger.defaultLogLevel=DEBUG
使用slf4j與Log4j日志
現在我們可以試驗并更換不同的日志實現,但你的程序代碼可以保持不變。
我們要做的是用另一個流行的日志實現來替換掉slf4j-simple,比如Log4j。
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.5</version>
</dependency>
又一次,我們必須對我們選的每一個日志實現做配置。在這個例子中,我們需要一個文件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
重運行你的程序,你會看到同樣的輸出結果。
使用slf4j和JDK日志
JDK實際上帶有一個日志包,你可以在pom.xml中替換為另一個日志實現。
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-jdk14</artifactId>
<version>1.7.5</version>
</dependency>
現在JDK日志的配置起來有一點困難。這里不僅需要一個配置文件src/main/resources/logging.properties,你還需要添加一個系統屬性
-Djava.util.logging.config.file=logging.properties
這是一個logging.properties的示例
level=INFO
handlers=java.util.logging.ConsoleHandler
java.util.logging.ConsoleHandler.level=FINEST
deng.level=FINEST
使用slf4j和Logback日志
Logback日志實現是一個高質量的實現。如果你想在項目中寫認真的代碼,你會想要考慮這中方式。還是修改你的pom.xml文件,替換成這樣
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.0.13</version>
</dependency>
這是一個簡單的配置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寫你自己的日志庫
如果你正在很多終端用戶(END USER)提供Java庫,那么讓你的項目僅依賴slf4j-api絕對是個好想法,然后讓你的用戶在他們開發和運營環境中選擇任意的日志實現。作為終端用戶,他們可以快速地從上面提到的日志庫中選擇一個,并且從他們自己喜歡的日志實現的特性中受益。
翻譯自: How to Configure SLF4J with Different Logger Implementations