slf4j是如何绑定具体的日志框架的?

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: slf4j是如何绑定具体的日志框架的?

阅读分析slf4j的日志源码,发现其中涵盖了许多知识点和优秀的设计,关键它们都是活生生的实践案例。写成系列文章与大家分享,欢迎持续关注。第3篇。

slf4j日志框架绑定流程

在《slf4j中是如何运用SPI机制兼容各种日志框架的》一文当中,我们讲到slf4j通过SPI机制,可以扫描到对应日志框架jar包中META-INF/services下配置的SLF4JServiceProvider的实现类。进而通过SLF4JServiceProvider的实现类获得对应Logger的工厂类。

关于相关SPI的更多内容,可以回头看上篇文章。本篇文章开始,我们首先想一个问题,如果项目中出现多个日志框架,也就出现多个SLF4JServiceProvider的SPI相关配置,针对这种情况slf4j会如何处理?我们在使用的过程中又该注意些什么?

LoggerFactory的bind方法

要解决上面的问题,先来看一下LoggerFactory中绑定SLF4JServiceProvider的bind方法的具体实现代码:
































private static void bind() {    try {        List<SLF4JServiceProvider> providersList = findServiceProviders();        // 如果出现多个SLF4JServiceProvider实例,则打印警告信息。        reportMultipleBindingAmbiguity(providersList);        // 判断是否扫描到对应的SLF4JServiceProvider实现类        if(!providersList.isEmpty()) {            PROVIDER = providersList.get(0);            // SLF4JServiceProvider.initialize() is intended to be called here and nowhere else.            PROVIDER.initialize();            INITIALIZATION_STATE = SUCCESSFUL_INITIALIZATION;            // 打印绑定了哪个SLF4JServiceProvider            reportActualBinding(providersList);        } else {            // 如果未扫描到对应的实现类,初始化状态变为无操作的应急NOPServiceProvider            INITIALIZATION_STATE = NOP_FALLBACK_INITIALIZATION;            // 下面三行警告信息,在项目中未使用日志框架时,经常会看到。            Util.report("No SLF4J providers were found.");            Util.report("Defaulting to no-operation (NOP) logger implementation");            Util.report("See " + NO_PROVIDERS_URL + " for further details.");
            // 打印忽略掉的静态Logger绑定            Set<URL> staticLoggerBinderPathSet = findPossibleStaticLoggerBinderPathSet();            reportIgnoredStaticLoggerBinders(staticLoggerBinderPathSet);        }        postBindCleanUp();    } catch (Exception e) {        failedBinding(e);        throw new IllegalStateException("Unexpected initialization failure", e);    }}

通过bind方法源码,我们可以看出绑定SLF4JServiceProvider(也就是对应的日志框架实现该接口的实例)的流程为:

  • 1、通过SPI机制扫描项目类路径下所有实现SLF4JServiceProvider接口并按照SPI机制配置的类;
  • 2、如果出现多个SLF4JServiceProvider实例,会打印警告信息;
  • 3、如果实例列表中存在1个或多个实例,只获取第一个实例。此处需要注意,如果配置多个日志框架,只会使用最先被加载的那一个;
  • 4、如果一个日志框架都不存在,则打印警告信息。

上述流程中我们需要注意什么?

第一,尽量避免在使用slf4j的时候出现多个日志框架,即便其他日志框架因三方框架引入,我们也可以通过调整SLF4JServiceProvider的引入来避免。比如当我们引入了logback框架时,对应的SPI配置位于logback-classic-xx.jar中,而logback-core-xx.jar中并没有,也就是如果不引入logback-classic的jar包,就不会触发SPI机制。同样的,如果想使用slf4j来集成log4j,那仅仅引入log4j的日志框架是无效的,还需要引入slf4j为其配置的SPI的依赖slf4j-log4j12,slf4j才能够扫描的到。

第二,如果启动程序时,看到控制台打印如下警告信息,你应该知道slf4j并没有成功扫描到日志框架。




SLF4J: No SLF4J providers were found.SLF4J: Defaulting to no-operation (NOP) logger implementationSLF4J: See http://www.slf4j.org/codes.html#noProviders for further details.

上面的警告信息在我们使用了slf4j,但并未引入其他日志框架,或没有引入桥接的依赖时经常会出现。通过阅读上面的源代码,我们很明确的知道该异常信息为什么会发生,如何去解决了。

第三,如果扫描到多个日志框架,怎么确定当前使用了哪个?可通过上述代码中reportActualBinding打印的日志来判断:"Actual provider is of type [" + providerList.get(0) + "]"。此时如果并不是项目需要使用的日志框架,可参考第一条,在pom文件中进行排查依赖处理。

找到多个实现类会取第一个,但是谁是第一个呢?看官方解释:

The warning emitted by SLF4J is just that, a warning. Even when multiple bindings are present, SLF4J will pick one logging framework/implementation and bind with it. The way SLF4J picks a binding is determined by the JVM and for all practical purposes should be considered random. As of version 1.6.6, SLF4J will name the framework/implementation class it is actually bound to.

答案就是:取决于JVM,你可以认为就是随机的。

小结

我们经常在使用日志框架,也经常在使用slf4j,我们还经常看到一些SLF4J的警告信息,只有像本篇文章这样,认证阅读了相应的源码,了解了底层处理的业务逻辑,我们才能够更好的知道什么情况下该做怎样的处理,什么异常是什么原因导致的。

相关实践学习
通过日志服务实现云资源OSS的安全审计
本实验介绍如何通过日志服务实现云资源OSS的安全审计。
目录
相关文章
|
7月前
|
存储 Java 文件存储
微服务——SpringBoot使用归纳——Spring Boot使用slf4j进行日志记录—— logback.xml 配置文件解析
本文解析了 `logback.xml` 配置文件的详细内容,包括日志输出格式、存储路径、控制台输出及日志级别等关键配置。通过定义 `LOG_PATTERN` 和 `FILE_PATH`,设置日志格式与存储路径;利用 `&lt;appender&gt;` 节点配置控制台和文件输出,支持日志滚动策略(如文件大小限制和保存时长);最后通过 `&lt;logger&gt;` 和 `&lt;root&gt;` 定义日志级别与输出方式。此配置适用于精细化管理日志输出,满足不同场景需求。
1655 1
|
7月前
|
Java 微服务 Spring
微服务——SpringBoot使用归纳——Spring Boot使用slf4j进行日志记录——使用Logger在项目中打印日志
本文介绍了如何在项目中使用Logger打印日志。通过SLF4J和Logback,可设置不同日志级别(如DEBUG、INFO、WARN、ERROR)并支持占位符输出动态信息。示例代码展示了日志在控制器中的应用,说明了日志配置对问题排查的重要性。附课程源码下载链接供实践参考。
778 0
|
7月前
|
SQL Java 数据库连接
微服务——SpringBoot使用归纳——Spring Boot使用slf4j进行日志记录—— application.yml 中对日志的配置
在 Spring Boot 项目中,`application.yml` 文件用于配置日志。通过 `logging.config` 指定日志配置文件(如 `logback.xml`),实现日志详细设置。`logging.level` 可定义包的日志输出级别,例如将 `com.itcodai.course03.dao` 包设为 `trace` 级别,便于开发时查看 SQL 操作。日志级别从高到低为 ERROR、WARN、INFO、DEBUG,生产环境建议调整为较高级别以减少日志量。本课程采用 yml 格式,因其层次清晰,但需注意格式要求。
640 0
|
7月前
|
Java API 开发者
微服务——SpringBoot使用归纳——Spring Boot使用slf4j进行日志记录——slf4j 介绍
在软件开发中,`System.out.println()`常被用于打印信息,但大量使用会增加资源消耗。实际项目推荐使用slf4j结合logback输出日志,效率更高。Slf4j(Simple Logging Facade for Java)是一个日志门面,允许开发者通过统一方式记录日志,无需关心具体日志系统。它支持灵活切换日志实现(如log4j或logback),且具备简洁占位符和日志级别判断等优势。阿里巴巴《Java开发手册》强制要求使用slf4j,以保证日志处理方式的统一性和维护性。使用时只需通过`LoggerFactory`创建日志实例即可。
472 0
|
11月前
|
XML 安全 Java
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
本文介绍了Java日志框架的基本概念和使用方法,重点讨论了SLF4J、Log4j、Logback和Log4j2之间的关系及其性能对比。SLF4J作为一个日志抽象层,允许开发者使用统一的日志接口,而Log4j、Logback和Log4j2则是具体的日志实现框架。Log4j2在性能上优于Logback,推荐在新项目中使用。文章还详细说明了如何在Spring Boot项目中配置Log4j2和Logback,以及如何使用Lombok简化日志记录。最后,提供了一些日志配置的最佳实践,包括滚动日志、统一日志格式和提高日志性能的方法。
2990 31
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
|
12月前
|
XML JSON Java
Logback 与 log4j2 性能对比:谁才是日志框架的性能王者?
【10月更文挑战第5天】在Java开发中,日志框架是不可或缺的工具,它们帮助我们记录系统运行时的信息、警告和错误,对于开发人员来说至关重要。在众多日志框架中,Logback和log4j2以其卓越的性能和丰富的功能脱颖而出,成为开发者们的首选。本文将深入探讨Logback与log4j2在性能方面的对比,通过详细的分析和实例,帮助大家理解两者之间的性能差异,以便在实际项目中做出更明智的选择。
1082 3
|
7月前
|
SQL 数据库
【YashanDB知识库】应用绑定参数的慢查询,慢日志抓取不到
【YashanDB知识库】应用绑定参数的慢查询,慢日志抓取不到
|
9月前
|
开发框架 运维 监控
Spring Boot中的日志框架选择
在Spring Boot开发中,日志管理至关重要。常见的日志框架有Logback、Log4j2、Java Util Logging和Slf4j。选择合适的日志框架需考虑性能、灵活性、社区支持及集成配置。本文以Logback为例,演示了如何记录不同级别的日志消息,并强调合理配置日志框架对提升系统可靠性和开发效率的重要性。
288 5
|
12月前
|
数据采集 监控 Java
SpringBoot日志全方位超详细手把手教程,零基础可学习 日志如何配置及SLF4J的使用......
本文是关于SpringBoot日志的详细教程,涵盖日志的定义、用途、SLF4J框架的使用、日志级别、持久化、文件分割及格式配置等内容。
745 2
SpringBoot日志全方位超详细手把手教程,零基础可学习 日志如何配置及SLF4J的使用......
|
12月前
|
Java 程序员 API
Android|集成 slf4j + logback 作为日志框架
做个简单改造,统一 Android APP 和 Java 后端项目打印日志的体验。
505 1

热门文章

最新文章