欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 游戏 > Java - 日志体系_Simple Logging Facade for Java (SLF4J)日志门面_SLF4J集成JUL 及 原理分析

Java - 日志体系_Simple Logging Facade for Java (SLF4J)日志门面_SLF4J集成JUL 及 原理分析

2025/9/25 3:02:15 来源:https://blog.csdn.net/yangshangwei/article/details/144794815  浏览:    关键词:Java - 日志体系_Simple Logging Facade for Java (SLF4J)日志门面_SLF4J集成JUL 及 原理分析

文章目录

  • 官网
  • 集成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 (LoggerLoggerFactory),但实际的日志输出是通过 JDK 自带的 java.util.logging.Logger 完成的。


原理分析

SLF4J 与 JUL 的集成

slf4j-jdk14 包中,org/slf4j/impl/StaticLoggerBinder.class 类是关键,它负责将 SLF4J 与 JDK 日志(JUL)集成。StaticLoggerBinder 类的作用是为 SLF4J 提供底层日志框架的绑定。对于 slf4j-jdk14StaticLoggerBinder 类返回的 ILoggerFactory 类型是 JDK14LoggerFactory

private StaticLoggerBinder() {loggerFactory = new org.slf4j.impl.JDK14LoggerFactory();
}

获取 ILoggerFactory 的过程

由于类路径下存在 StaticLoggerBinder 类,SLF4J 会选择 slf4j-jdk14 中的 StaticLoggerBinder 来创建一个单例对象并返回 ILoggerFactory 实例。StaticLoggerBinder 中的 ILoggerFactoryJDK14LoggerFactory,它负责创建 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 日志框架绑定。
  • JDK14LoggerFactoryILoggerFactory 的实现,它负责创建 JDK14LoggerAdapter,后者包装了 java.util.logging.Logger 并将其作为 SLF4J 的 Logger 实例使用。
  • 日志调用最终通过 JDK14LoggerAdapter 转发到 JDK 自带的 java.util.logging.Logger

在这里插入图片描述

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词