如何配置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

相关文章
相关标签/搜索