文章目录
- 官网
- 集成Jdk_logging步骤
- POM依赖
- 使用
- 原理分析
- SLF4J 与 JUL 的集成
- 获取 `ILoggerFactory` 的过程
- 根据 `ILoggerFactory` 获取 `Logger` 实例的过程
- 小结
官网
https://slf4j.org/
Simple Logging Facade for Java (SLF4J) 用作各种日志记录框架(e.g. java.util.logging、logback、log4j)的简单外观或抽象,允许最终用户在部署时插入所需的日志记录框架 时间。
请注意,启用 SLF4J 的库意味着仅添加一个强制依赖项,即 slf4j-api.jar。 如果在类路径上找不到绑定/提供程序,则 SLF4J 将 default 为 no-operation 实现。
SLF4J user manual:https://slf4j.org/manual.html
集成Jdk_logging步骤
POM依赖
SLF4J 与 JDK 日志(JUL)集成需要以下依赖:
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>2.0.16</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-jdk14</artifactId>
<version>2.0.16</version>
</dependency>
slf4j-api
: SLF4J 的核心 API。slf4j-jdk14
: SLF4J 与 JDK 自带日志(JUL)的适配器,允许 SLF4J 日志调用转发到java.util.logging
。
使用
使用 SLF4J 记录日志,但实际输出通过 JDK 自带的 java.util.logging.Logger
实现:
package com.artisan;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
*
* slf4j 与 jdk-logging 集成
*/
public class Slf4jJdkLogging {
private static final Logger logger= LoggerFactory.getLogger(Slf4jJdkLogging.class);
public static void main(String[] args){
logger.trace("Slf4jJdkLogging This is a trace message");
logger.debug("Slf4jJdkLogging This is a debug message");
logger.info("Slf4jJdkLogging This is an info message");
logger.warn("Slf4jJdkLogging This is a warning message");
logger.error("Slf4jJdkLogging This is an error message");
}
}
输出的日志将显示为:
虽然代码使用了 SLF4J 的 API (Logger
和 LoggerFactory
),但实际的日志输出是通过 JDK 自带的 java.util.logging.Logger
完成的。
原理分析
SLF4J 与 JUL 的集成
在 slf4j-jdk14
包中,org/slf4j/impl/StaticLoggerBinder.class
类是关键,它负责将 SLF4J 与 JDK 日志(JUL)集成。StaticLoggerBinder
类的作用是为 SLF4J 提供底层日志框架的绑定。对于 slf4j-jdk14
,StaticLoggerBinder
类返回的 ILoggerFactory
类型是 JDK14LoggerFactory
。
private StaticLoggerBinder() {
loggerFactory = new org.slf4j.impl.JDK14LoggerFactory();
}
获取 ILoggerFactory
的过程
由于类路径下存在 StaticLoggerBinder
类,SLF4J 会选择 slf4j-jdk14
中的 StaticLoggerBinder
来创建一个单例对象并返回 ILoggerFactory
实例。StaticLoggerBinder
中的 ILoggerFactory
是 JDK14LoggerFactory
,它负责创建 SLF4J 定义的 Logger
实例。
private static final ILoggerFactory loggerFactory;
根据 ILoggerFactory
获取 Logger
实例的过程
JDK14LoggerFactory
实现了 ILoggerFactory
接口,负责返回一个 SLF4J 定义的 Logger
实例。具体来说,JDK14LoggerFactory
使用 JDK 自带的 java.util.logging.Logger
来创建日志实例,并通过 JDK14LoggerAdapter
将其包装成 SLF4J 的 Logger
实现。
java.util.logging.Logger julLogger = java.util.logging.Logger.getLogger(name);
Logger newInstance = new JDK14LoggerAdapter(julLogger);
java.util.logging.Logger.getLogger(name)
创建了一个标准的 JDK 日志记录器实例。JDK14LoggerAdapter
是 SLF4J 为 JDK 日志提供的适配器,它实现了 SLF4J 的Logger
接口,并将日志请求委托给 JDK 的日志记录器。
最终,SLF4J 的 Logger
实例实际上是一个 JDK14LoggerAdapter
,该适配器会将 SLF4J 日志调用转发到 JDK 自带的日志实现。
小结
- SLF4J 通过
slf4j-jdk14
包与 JDK 自带的日志(JUL)进行集成。StaticLoggerBinder
类在类路径中负责将 SLF4J 与 JDK 日志框架绑定。 JDK14LoggerFactory
是ILoggerFactory
的实现,它负责创建JDK14LoggerAdapter
,后者包装了java.util.logging.Logger
并将其作为 SLF4J 的Logger
实例使用。- 日志调用最终通过
JDK14LoggerAdapter
转发到 JDK 自带的java.util.logging.Logger
。