SLF4J不同的日志实现选择

一.使用slf4j做简单的日志记录

创建基于Maven的工程,在pom.xml中添加如下内容

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

现在你可以在你的Java代码中这样使用Logger:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class HelloLog {

    static Logger LOGGER = LoggerFactory.getLogger(HelloLog.class);

    public static void main(String[] args) {
        
        System.out.println("log对象为: " + LOGGER);
        System.out.println("真实对象为: " + LOGGER.getClass());
        
        for (int i = 0; i < 10; i++)
            if (i % 2 == 0) {
                LOGGER.info("Hello {}", i);
            } else {
                LOGGER.debug("I am on index {}", i);
            }
    }
}

以上代码可以编译通过,但是当你运行它时,你会看到这样的输出:

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.
-------------org.slf4j.helpers.NOPLogger(NOP)
-------------class org.slf4j.helpers.NOPLogger

上面的意思是,在运行时,你没有做日志的实现(或者说日志的绑定),所以slf4j简简单单的使用了一个什么也不会做的空实现
为了看到正确的输出,你应该尝试使用一个简单(simple)的实现,这个实现根本不需要任何配置!只要回到pom.xml然后添加如下配置

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

现在你可以在控制台看见INFO级别的日志输出了。这个简单的logger会默认显示任何INFO或者更高级别的信息。如下:

log对象为: org.slf4j.impl.SimpleLogger(com.study.HelloLog)
真实对象为: class org.slf4j.impl.SimpleLogger
[main] INFO com.study.HelloLog - Hello 0
[main] INFO com.study.HelloLog - Hello 2
[main] INFO com.study.HelloLog - Hello 4
[main] INFO com.study.HelloLog - Hello 6
[main] INFO com.study.HelloLog - Hello 8

想要看DEBUG级别的信息,你需要在Java启动时传入这个系统属性(system property)

-Dorg.slf4j.simpleLogger.defaultLogLevel=DEBUG

输出结果如下:

log对象为: org.slf4j.impl.SimpleLogger(com.study.HelloLog)
真实对象为: class org.slf4j.impl.SimpleLogger
[main] INFO com.study.HelloLog - Hello 0
[main] DEBUG com.study.HelloLog - I am on index 1
[main] INFO com.study.HelloLog - Hello 2
[main] DEBUG com.study.HelloLog - I am on index 3
[main] INFO com.study.HelloLog - Hello 4
[main] DEBUG com.study.HelloLog - I am on index 5
[main] INFO com.study.HelloLog - Hello 6
[main] DEBUG com.study.HelloLog - I am on index 7
[main] INFO com.study.HelloLog - Hello 8
[main] DEBUG com.study.HelloLog - I am on index 9

二.使用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: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/E:/OpenSources/repository/org/slf4j/slf4j-log4j12/1.7.5/slf4j-log4j12-1.7.5.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/E:/OpenSources/repository/org/slf4j/slf4j-simple/1.7.5/slf4j-simple-1.7.5.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]
log对象为: org.slf4j.impl.Log4jLoggerAdapter(com.study.HelloLog)
真实对象为: class org.slf4j.impl.Log4jLoggerAdapter
 INFO [main] (HelloLog.java:22) - Hello 0
DEBUG [main] (HelloLog.java:24) - I am on index 1
 INFO [main] (HelloLog.java:22) - Hello 2
DEBUG [main] (HelloLog.java:24) - I am on index 3
 INFO [main] (HelloLog.java:22) - Hello 4
DEBUG [main] (HelloLog.java:24) - I am on index 5
 INFO [main] (HelloLog.java:22) - Hello 6
DEBUG [main] (HelloLog.java:24) - I am on index 7
 INFO [main] (HelloLog.java:22) - Hello 8
DEBUG [main] (HelloLog.java:24) - I am on index 9

从输出日志可以看出,slf4j找到了两个实现,但这里用了Log4j作为实现,这里有个细节要注意,当有多个实现的时候,pom文件中哪个实现写在前面,就用哪个实现.大家可以自己调整一下位置再试一下.

三.使用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日志实现是一个高质量的实现。SpringBoot中默认就是采用这种日志。还是修改你的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>

五.总结

如果你正在很多终端用户(END USER)提供Java库,那么让你的项目仅依赖slf4j-api绝对是个好想法,然后让你的用户在他们开发和运营环境中选择任意的日志实现。作为终端用户,他们可以快速地从上面提到的日志库中选择一个,并且从他们自己喜欢的日志实现的特性中受益。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SLF4J 是一个简单的日志门面,它提供了一组日志 API,可以与许多流行的日志框架(例如 logback、log4j、java.util.logging)集成。而 logback 则是一个功能强大的日志框架,它是 log4j 框架的继承者,提供了更好的性能和更丰富的特性。 要使用 SLF4J + logback 实现日志输出和记录,需要按照以下步骤进行: 1. 引入依赖:在项目的 pom.xml 文件中加入以下依赖: ``` <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.30</version> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.2.3</version> </dependency> ``` 2. 配置 logback.xml 文件:在项目的 src/main/resources 目录下创建 logback.xml 文件,并配置日志输出的格式、级别、输出目标等信息。以下是一个简单的 logback.xml 配置示例: ``` <configuration> <appender name="console" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> </appender> <root level="INFO"> <appender-ref ref="console" /> </root> </configuration> ``` 该配置将日志输出到控制台中,并显示日志的时间、线程、级别、类名和消息内容。 3. 在代码中使用 SLF4J API:在需要记录日志的代码中,使用 SLF4J API 进行日志记录。以下是一个示例: ``` import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class MyClass { private static final Logger LOGGER = LoggerFactory.getLogger(MyClass.class); public void doSomething() { LOGGER.info("This is a log message."); } } ``` 在这个示例中,我们使用 LoggerFactory.getLogger() 方法获取了一个 Logger 对象,并使用该对象进行日志记录。在记录日志时,我们使用了 LOGGER.info() 方法,指定日志的级别为 INFO。 以上就是使用 SLF4J + logback 实现日志输出和记录的基本步骤。通过 SLF4J,我们可以方便地切换不同日志框架,而 logback 则提供了强大的日志功能,例如异步日志记录、定时滚动日志文件等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值