About SLF4J

SLF4J 是什么?

Java 的世界里有很多优秀的 log 库,比如 logback,log4j2。SLF4J(Simple Logging Facade)作为一个日志框架的抽象层,以 Facade 模式帮助我们“无缝”地选择、切换这些 log 库。

如何使用 SLF4J?

在项目中要使用 SLF4J 需要做的就是引入 slf4j-api-2.0.7.jar,再根据你选择的底层 log 框架选择对应的 provider。比如,
如果底层使用 log4j2,就要导入 log4j-slf4j-impl(provider/bridge)、log4j-api.jar(log4j 接口)、log4j-core(log4j 实现)。
如果底层使用 logback,就要导入”ch.qos.logback:logback-classic”,这个会自动导入 slf4j-api-2.0.7.jar(provider/bridge)、logback-core-1.3.6.jar(logback 实现)。

SpringBoot 底层默认支持 logbak,如果使用 log4j2 则需要显示的 exclude logback。

<dependencies>
  <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
      <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-logging</artifactId>
        </exclusion>
      </exclusions>
  </dependency>
  <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-log4j2</artifactId>
  </dependency>
<dpendencies>

关于 SLF4J 的 MDC

SLF4J, 在底层库支持 MDC(Mapped Diagnostic Context)的情况下也是支持 MDC 的。MDC data can also be highly helpful in filtering messages or triggering certain actions, 目前也就 log4j2, logback 支持 MDC。在当前微服务流行的情况下让各个微服务的日志格式遵循同一格式是困难的,而且 MDC 的跨服务传递也是不现实的,这个特性在实际工程中用的比较少。

关于 log4j2 自己的 log。

  1. 如果我们希望看到 log4j2 自己的 log,可以设置-Dlog4j2.debug=true,让它自己的 log 显示在 console。
  2. Composite Configuration, 因为可以通过 log4j2.configurationFile 设置多个逗号分隔的配置文件,log4j 有一套自己的逻辑对多个配置文件进行 merge。所以除非项目中有特定的需求,显示的通过 log4j2.configurationFile 显示的指定配置文件可以减少不必要的困惑。



References:
[1]: https://www.slf4j.org/manual.html
[2]: https://logging.apache.org/log4j/2.x/manual/configuration.html#CompositeConfiguration
[3]: https://howtodoinjava.com/logback/setting-up-slf4j/