如何配置SLF4J不一樣的日誌實現

使用slf4j庫做爲你的Java應用日誌API層有不少好處,這裏我會展現一小部分關於如何使用和配置它的例子。html

你能夠把slf4j想成一個Java的接口,而後你須要實現這個接口,從而在運行時提供實際的日誌記錄,例如把日誌寫到控制檯(STDOUT)或者一個文件上等等。每種實現(或成爲綁定)都顯而易見地有他們本身的方式來配置日誌的輸出,可是你的應用對實現者並沒有感知而且一直使用相同的org.slf4j.Logger API。讓咱們看看如何在實際中使用它。java

使用slf4j作簡單的日誌記錄

建立基於Maven的工程,在pom.xml中添加以下內容apache

<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-api</artifactId>
  <version>1.7.5</version>
</dependency>

如今你能夠在你的Java代碼中這樣使用Loggerapi

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

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而後添加以下配置app

<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=DEBUGdebug

使用slf4j與Log4j日誌

如今咱們能夠試驗並更換不一樣的日誌實現,但你的程序代碼能夠保持不變。
咱們要作的是用另外一個流行的日誌實現來替換掉slf4j-simple,好比Log4j。日誌

<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-log4j12</artifactId>
  <version>1.7.5</version>
</dependency>

又一次,咱們必須對咱們選的每個日誌實現作配置。在這個例子中,咱們須要一個文件src/main/resources/log4j.propertiescode

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

相關文章
相關標籤/搜索