【Slf4j分析】slf4j-api和slf4j-simple

一.基础

使用maven:


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

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

slf4j-api包 是日志的接口,log4j,logback等等才是日志的真正实现。
slf4j-simple包 是slf4j提供的一个简单实现 。
当我们调用接口时,接口的工厂会自动寻找恰当的实现,返回一个实现的实例给我提供服务,如下图。

这里写图片描述

二.重要的类和接口

最关键的2个接口,分别是Logger和ILoggerFactory。最关键的类,是LoggerFactory

Logger接口

用来记录日志,提供了打印各种级别日志的功能。
实现类有NOPLogger 和 SimpleLogger等,NOPLogger如同它的名字一样:什么都不做 ,SimpleLogger在slf4j-simple包中,可通过配置日志输出方式,显示格式,日志级别等来打印日志。

ILoggerFactory接口

通过他来直接获取Logger

LoggerFactory 类

这个类是获取Logger的门面,他的内部是通过ILoggerFactory来获取Logger的

三.LoggerFactory 类详解

LoggerFactory使用getLogger()方法获取Logger对象

public class Main {
    public static void main(String[] args) {
        Logger logger = LoggerFactory.getLogger(Main.class);

        logger.debug("debug");
        logger.info("info");
    }
}

getLogger()是重载方法,可以接受一个字符串或class类型,接受字符串参数的方法如下所示:

 public static Logger getLogger(String name) {
     ILoggerFactory iLoggerFactory = getILoggerFactory();//***
     return iLoggerFactory.getLogger(name);
 }

进入getILoggerFactory()方法,这个类简化如下:

 public static ILoggerFactory getILoggerFactory() {
     //使用加锁的方式保证仅仅一次初始化(具体看源码)
     performInitialization();

     //使用StaticLoggerBinder类获取真正的日志工厂,将在下一节介绍   
     return StaticLoggerBinder.getSingleton().getLoggerFactory();

 }

performInitialization()详解,这个方法包括bind()–绑定 和versionSanityCheck() 版本检查,把他们合并简化如下

private final static void performInitialization() {
        bind();//绑定日志实现

        versionSanityCheck();//版本检查

}

bind()方法简化如下

 private final static void bind() {

      Set<URL> staticLoggerBinderPathSet = null;

      staticLoggerBinderPathSet = findPossibleStaticLoggerBinderPathSet();
      //处理多个日志框架的问题
      reportMultipleBindingAmbiguity(staticLoggerBinderPathSet);

      //获取日志绑定类LoggerFactoryBinder
      StaticLoggerBinder.getSingleton();
      INITIALIZATION_STATE = SUCCESSFUL_INITIALIZATION;
      reportActualBinding(staticLoggerBinderPathSet);
      fixSubstituteLoggers();
      replayEvents();
      // release all resources in SUBST_FACTORY
      SUBST_FACTORY.clear();

}

四.LoggerFactoryBinder接口及其StaticLoggerBinder类

LoggerFactoryBinder接口是slf4j中的,日志框架必须有一个StaticLoggerBinder类实现这个接口
slf4j通过StaticLoggerBinder来帮顶具体的日志框架,它有两个重要方法

  • getSingleton()来获取StaticLoggerBinder的一个单例,
  • getLoggerFactory()方法来获取真正的日志工厂(ILoggerFactory的具体子类)

五.Logger

用来记录日志

实现类SimpleLogger

这个类是simpl-logger中的类,他提供了记录日志等多种功能

六.ILoggerFactory

这个接口有一个方法,用来获取日志

public interface ILoggerFactory {

    public Logger getLogger(String name);
}

slf4j-simple中的实现类SimpleLoggerFactory

public class SimpleLoggerFactory implements ILoggerFactory {

    ConcurrentMap<String, Logger> loggerMap;

    //初始化 1.持有的ConcurrentHashMap用来保存所有日志
    //2.
    public SimpleLoggerFactory() {

        loggerMap = new ConcurrentHashMap<String, Logger>();
        SimpleLogger.init();
    }

    /**
     * Return an appropriate {@link SimpleLogger} instance by name.
     */
    public Logger getLogger(String name) {
        Logger simpleLogger = loggerMap.get(name);
        if (simpleLogger != null) {
            return simpleLogger;
        } else {
            Logger newInstance = new SimpleLogger(name);
            Logger oldInstance = loggerMap.putIfAbsent(name, newInstance);
            return oldInstance == null ? newInstance : oldInstance;
        }
    }

    /**
     * Clear the internal logger cache.
     *
     * This method is intended to be called by classes (in the same package) for
     * testing purposes. This method is internal. It can be modified, renamed or
     * removed at any time without notice.
     *
     * You are strongly discouraged from calling this method in production code.
     */
    void reset() {
        loggerMap.clear();
    }
}

七.总结

-slf4j-api中的slf4j-simple中的实现说明
1LoggerFactory类-通过ILoggerFactory子类获取Logger对象
2ILoggerFactory接口SimpleLoggerFactory类直接获取Logger对象
3Logger接口SimpleLogger类记录日志
4LoggerFactoryBinder接口StaticLoggerBinder绑定具体的日志(ILoggerFactory类)
  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 您好!您可以通过以下步骤下载slf4j-api-1.7.30.jar: 1. 打开https://www.slf4j.org/download.html网站。 2. 在“SLF4J 1.7.30”下面的“Download”栏中,单击“slf4j-api-1.7.30.zip”链接。 3. 下载完成后,解压缩zip文件。 4. 在解压缩的文件夹中,您可以找到“slf4j-api-1.7.30.jar”文件,将其复制到您的项目中即可。 希望这可以帮助您! ### 回答2: 要下载slf4j-api-1.7.30.jar,可以按照以下步骤进行: 1. 打开您常用的浏览器,如谷歌浏览器或火狐浏览器等。 2. 在搜索引擎中输入"slf4j-api-1.7.30.jar下载",然后按下Enter键进行搜索。 3. 浏览器会列出相关的搜索结果页面,您可以选择其中一个可靠的网站,如官方网站或Maven仓库等。 4. 进入您选择的网站后,在网站的搜索框中输入"slf4j-api-1.7.30.jar",然后点击搜索按钮或按下Enter键。 5. 网站会列出与您搜索关键词相关的文件。找到"slf4j-api-1.7.30.jar"文件并点击下载链接。 6. 系统会提示您选择文件的保存位置。您可以选择将其保存在您电脑中合适的文件夹中,以便于稍后安装或使用。 7. 等待文件下载完成。下载速度取决于您的网络连接速度。 8. 下载完成后,您可以在指定的文件夹中找到"slf4j-api-1.7.30.jar"文件。 请注意,确保下载文件的来源可靠和安全,并且与您的操作系统兼容。 ### 回答3: slf4j-api-1.7.30.jar 是一个用于Java应用程序的日志框架的jar文件。它是Simple Logging Facade for Java (SLF4J)的API模块,用于将不同的日志实现与应用程序代码分离。通过使用SLF4J,可以在应用程序中编写一致的日志记录代码,而不依赖于特定的日志实现。 下载 slf4j-api-1.7.30.jar 可以通过多种途径实现。其中一种方法是在SLF4J的官方网站上下载。访问官方网站后,找到下载页并选择相应的版本进行下载。另外,也可以通过Maven等构建工具进行下载。在项目的pom.xml文件中指定 slf4j-api 的依赖,构建工具会自动下载并管理相关的jar文件。 下载后,将 slf4j-api-1.7.30.jar 添加到项目的构建路径中。这样,在编写日志记录代码时,就可以使用SLF4J提供的API进行日志记录,而不需要关注具体的日志实现。SLF4J支持多种日志实现,如Logback、Log4j等,可以根据需要选择合适的实现,并将其相应的jar文件添加到项目中。 总结来说,下载 slf4j-api-1.7.30.jar 是为了在Java应用程序中使用SLF4J日志框架。下载后,将其添加到项目的构建路径中,然后可以使用SLF4JAPI进行日志记录,而无需直接依赖于特定的日志实现。这样可以方便地对日志框架进行切换和管理,提高代码的可维护性和灵活性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值