SLF4j

SLF4J 用作各种日志框架(java.util.logging, logback, log4j)的简单抽象,允许最终用户在部署时插入所需的日志框架。

在开始使用SLF4J之前,我们强烈建议您阅读两页的SLF4J用户手册。

注意,启用slf4j的库意味着只添加一个强制依赖项,即 slf4j-api.jar

如果在类路径上没有找到绑定,那么SLF4J将默认为无操作实现。

如果您希望将Java源文件迁移到SLF4J,请考虑我们的migrator工具,它可以在几分钟内将项目迁移到SLF4J API。

如果您所依赖的外部维护组件使用的是SLF4J以外的日志API,比如commons logging、log4j 或 java.util.logging,看看SLF4J对遗留api的二进制支持。

快速开始

jar 引入

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

代码

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

public class HelloWorld {

    public static void main(String[] args) {
        Logger logger = LoggerFactory.getLogger(HelloWorld.class);
        logger.info("Hello World");
    }

}

日志信息

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.

Process finished with exit code 0

修复

上面的日志告诉我们,没有发现任何的一个实现。

添加如下依赖:

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

重新运行,日志如下:

[main] INFO com.github.houbb.tech.validation.slf4j.HelloWorld - Hello World

很赞~~~

最佳实践

使用 {},让你的日志变得更加优雅。

public static void main(String[] args) {
    Logger logger = LoggerFactory.getLogger(PatternUsage.class);
    logger.info("{} is {} years old", "ryo", 18);
}

日志信息:

[main] INFO com.github.houbb.tech.validation.slf4j.PatternUsage - ryo is 18 years old
  • 拓展阅读

“What is the fastest way of logging?”

不同日志的切换

要切换日志记录框架,只需在类路径上替换slf4j绑定。

例如,从 java.util.logging 切换到 log4j,只需替换 slf4j-jdk14-1.8.0-beta2.jar 与 slf4j-log4j12-1.8.0-beta2.jar 。

SLF4J不依赖于任何特殊的类装入器机械。

实际上,每个SLF4J绑定在编译时都硬连接到一个且只有一个特定的日志记录框架。

例如,slf4j-log4j12-1.8.0-beta2。jar绑定在编译时绑定以使用log4j。

在您的代码中,除了slf4j-api-1.8.0-beta2。jar,您只需要将您选择的一个绑定放到适当的类路径位置。

不要在类路径上放置多个绑定。这里有一个图形说明的大意。

log

SLF4J接口及其各种适配器非常简单。大多数熟悉Java语言的开发人员应该能够在不到一个小时的时间内阅读并完全理解代码。不需要了解类装入器,因为SLF4J既不使用,也不直接访问任何类装入器。因此,SLF4J不会遇到Jakarta Commons Logging (JCL)所观察到的类装入器问题或内存泄漏问题。

考虑到SLF4J接口及其部署模型的简单性,新日志框架的开发人员应该会发现编写SLF4J绑定非常容易。

MDC

Mapped Diagnostic Context (MDC) support

“映射诊断上下文”本质上是日志框架维护的映射,其中应用程序代码提供键-值对,然后日志框架可以将键-值对插入到日志消息中。

MDC数据在过滤消息或触发某些操作方面也非常有用。

SLF4J支持MDC或映射诊断上下文。如果底层日志记录框架提供MDC功能,那么SLF4J将委托给底层框架的MDC。注意,此时,只有log4j和logback提供MDC功能。如果底层框架不提供MDC,例如java.util。然后,SLF4J将仍然存储MDC数据,但是其中的信息需要由自定义用户代码检索。

因此,作为SLF4J用户,您可以在log4j或logback存在的情况下利用MDC信息,但无需将这些日志框架作为依赖项强制要求用户使用。

应用场景

traceId 的信息处理

参考文档

  • slf4j

http://jayunit100.blogspot.com/2013/10/simplifying-distinction-between-sl4j.html

  • 系列学习

https://logback.qos.ch/manual/introduction.html

  • mdc

https://logback.qos.ch/manual/mdc.html