美文网首页
如何配置SLF4J不同的日志实现

如何配置SLF4J不同的日志实现

作者: BenjaminY | 来源:发表于2021-04-13 10:11 被阅读0次

    使用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

    相关文章

      网友评论

          本文标题:如何配置SLF4J不同的日志实现

          本文链接:https://www.haomeiwen.com/subject/ohuqlltx.html