首页 > 编程语言 >【日常记录-Java】SLF4J扫描实现框架的过程

【日常记录-Java】SLF4J扫描实现框架的过程

时间:2024-11-01 14:17:24浏览次数:3  
标签:初始化 Java 框架 实现 扫描 SLF4JServiceProvider SLF4J 日志

1. 简介

        SLF4J(Simple Logging Facade for Java)作为一种简单的门面或抽象,服务于其他各种日志框架,例如JUL、log4j、logback等,核心作用有两项:

  • 提供日志接口;
  • 提供获取具体日志对象的方法;

2. 扫描过程

  2.1 引入依赖

        在使用SLF4J时,需要引入其API依赖以及一个具体日志实现框架的依赖,如logback、log4j;

  2.2 服务加载

        从2.0.0版本开始,SLF4J通过Java的SPI(Service Provider Interface)技术来加载当前classpath下配置的SLF4JServiceProvider;在SPI包下,SLF4J定义了一个接口SLF4JServiceProvider,具体的日志实现框架会提供一个实现类,并配置在META-INF/services/org.slf4j.spi.SLF4JServiceProvider文件中;

  2.3 初始化过程

        当调用LoggerFactory的getLogger方法时,SLF4J会尝试加载并初始化一个SLF4JServiceProvider;

        若在classpath下找到了配置的SLF4JServiceProvider实现类,则使用该实现进行初始化;若未找的,则使用默认的NOPServiceProvider,该provider提供的logger不会输出任何东西;

  2.4 获取日志对象

        通过初始化后的SLF4JServiceProvider,可以获取到一个ILoggerFactory接口的实现,在通过该实现获取具体的Logger对象;

  2.5 日志记录

        使用获取到的Logger对象,可以调用其提供的日志记录方法(如info、error等)进行日志记录;这些日志记录方法会调用具体的日志实现框架来进行日志输出;

3. SLF4J的优势与特点

  • 解耦:通过引入SLF4J作为日志门面,可以将日志记录与具体的日志实现框架解耦,使得在更换日志实现框架时无需修改大量的代码;
  • 统一接口:SLF4J提供了统一的日志接口,使得开发者可以更加方便地进行日志记录;

4. 注意事项

  • 避免多个实现框架共存:同一个项目中,应避免同时引入多个SLF4J的实现框架,否则可能会导致冲突和不确定的行为;
  • 正确配置:应确保SLF4J的SPI配置文件(如META-INF/services/org.slf4j.spi.SLF4JServiceProvider)正确配置,以便SLF4J能够正确加载和初始化所需的日志实现框架;

标签:初始化,Java,框架,实现,扫描,SLF4JServiceProvider,SLF4J,日志
From: https://blog.csdn.net/zhaoyaxuan001/article/details/143363396

相关文章

  • JAVA 二叉树面试题
    @目录摘要代码Node节点main函数问题1:递归——求二叉树的最大深度问题2:求二叉树的最小深度问题3:求二叉树中节点的个数问题4:求二叉树中叶子节点的个数问题5:求二叉树中第k层节点的个数,不是求第k层叶子节点个数问题6:判断两棵树是否相同问题7:给定一个二叉树,检查它是否是镜像对称的。问......
  • 热点扫描:人工智能专利布局背后的商业博弈
    内容概要在当今科技飞速发展的时代,人工智能的崛起不仅推动了各行各业的创新,还引发了激烈的商业博弈。专利布局,作为企业保护核心技术和市场份额的重要手段,成为竞争中的焦点。许多企业通过合理的专利策略,对其在市场中的地位进行巩固和提升。越来越多的技术研发投入不仅产生了创......
  • 为什么 C++ 编译速度比 Java 慢得多
    ###为什么C++编译速度比Java慢得多在探讨为什么C++编译速度比Java慢得多时,我们可以归纳出几个核心原因:C++的编译模型更为复杂、模板元编程、宏处理以及链接时间。其中,C++的编译模型更为复杂这一点尤为突出。C++需要处理的细节更多,如模板实例化、头文件的重复包含等,这些......
  • Java 传参时,如何做到两个 String 实参的实际值交换_3
    ###Java传参时,如何做到两个String实参的实际值交换在Java中,所有的参数传递都是值传递,这意味着方法接收的是实参值的一个副本。对于基本数据类型,这个副本是实际值;对于对象,副本是引用的一个拷贝。因此,直接在方法内部交换两个`String`实参的实际值是不可能的。然而,可以通过一......
  • 一文彻底熟练掌握并使用Java的NIO操作
    一、基本概念JavaNIO是Java1.4引入的,用于处理高速、高并发的I/O操作。与传统的阻塞I/O不同,NIO支持非阻塞I/O和选择器,可以更高效地管理多个通道。二、核心组件通道(Channel)Channel是NIO中用于读取和写入数据的主要接口,提供双向数据传输的能力。常见的通道实现......
  • 基于Java的医疗保险报销系统设计与实现
    基于Java语言、Spring框架、SpringBoot、HTML/CSS/JavaScript、Vue、Jwt、Element-ui等技术,进行医疗保险报销系统的设计。本系统旨在将医疗保险报销系统中的分散信息进行归纳与整合,对其进行统一的信息管理,使其整个报销流程更加的系统化、科学化、透明化。在医疗保险报销系统......
  • Java-SE-泛型编程-总结/java
    泛型一、泛型的定义和使用类定义:在定义一个泛型类时,需要在类名后加上<T>,以指示这是一个泛型类。例如:publicclassPair<T>{...}方法定义:在定义泛型方法时,需要在返回类型前加上<T>,这样编译器才会知道这是一个泛型方法。例如:public<T>Tadd(Pair<T>p){...}......
  • JAVA开发笔记之mac基于jenv管理多java版本
    0x00本文主要记录mac上jenv管理多版本java的坑;前提是配置好brew镜像,确保brewupdate会正常执行而不是卡住。 0x01安装jenvbrewinstalljenv#添加jenv环境变量,修改用户文件夹下对应的~/.bash_profile或者~/.zhsrcexportPATH="$HOME/.jenv/bin:$PATH"eval"$(jenvi......
  • java+vue计算机毕设高校毕业生就业管理系统的设计与实现【开题+程序+论文+源码】
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着高等教育的普及和毕业生人数的逐年攀升,高校毕业生就业问题已成为社会各界关注的焦点。传统的就业管理模式在信息处理、资源匹配及效率提升方面已......
  • Java读取properties配置文件
    需要导入的jar<dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>5.3.14</version></dependency>方法:使用Spring PropertiesLoaderUtils.loadProperties();方法一......