`
liyixing1
  • 浏览: 957148 次
  • 性别: Icon_minigender_1
  • 来自: 江西上饶
社区版块
存档分类
最新评论

slf4j门面模式实现原理

阅读更多
在使用slf4j的时候,只需要通过门面类LoggerFactory类获取Logger
/**
   * Return a logger named according to the name parameter using the statically
   * bound {@link ILoggerFactory} instance.
   *
   * @param name The name of the logger.
   * @return logger
   */
  public static Logger getLogger(String name) {
    ILoggerFactory iLoggerFactory = getILoggerFactory();
    return iLoggerFactory.getLogger(name);
  }

  /**
   * Return a logger named corresponding to the class passed as parameter, using
   * the statically bound {@link ILoggerFactory} instance.
   *
   * @param clazz the returned logger will be named after clazz
   * @return logger
   */
  public static Logger getLogger(Class clazz) {
    return getLogger(clazz.getName());
  }


实际上,这种方式会得调用另外一个类

/**
   * Return the {@link ILoggerFactory} instance in use.
   * <p/>
   * <p/>
   * ILoggerFactory instance is bound with this class at compile time.
   *
   * @return the ILoggerFactory instance in use
   */
  public static ILoggerFactory getILoggerFactory() {
    if (INITIALIZATION_STATE == UNINITIALIZED) {
      INITIALIZATION_STATE = ONGOING_INITIALIZATION;
      performInitialization();
    }
    switch (INITIALIZATION_STATE) {
      case SUCCESSFUL_INITIALIZATION:
        return StaticLoggerBinder.getSingleton().getLoggerFactory();
      case NOP_FALLBACK_INITIALIZATION:
        return NOP_FALLBACK_FACTORY;
      case FAILED_INITIALIZATION:
        throw new IllegalStateException(UNSUCCESSFUL_INIT_MSG);
      case ONGOING_INITIALIZATION:
        // support re-entrant behavior.
        // See also http://bugzilla.slf4j.org/show_bug.cgi?id=106
        return TEMP_FACTORY;
    }
    throw new IllegalStateException("Unreachable code");
  }


注意看的是 return StaticLoggerBinder.getSingleton().getLoggerFactory();

实际上,它真正的方式是通过 org.slf4j.impl.StaticLoggerBinder
,但是,StaticLoggerBinder类在slf4j包中是不存在的。

这实际上就是slf4j的能自动识别实际上的logger日志的原理了。

它调用这个类,这个类,slf4j有一个大概的雏形,但是没有实现,(需要保证slf4j本身编译不报错)。也没有被打包成jar里面,而是由具体的实现该类的,比如log4j等自己实现这个类,并加入具体的jar。那么在实际运行时,就能调用到真实的日志包了。
分享到:
评论

相关推荐

    浅谈Java日志框架slf4j作用及其实现原理

    SLF4J的设计理念是遵循门面模式,将复杂的日志实现细节隐藏起来,提供一个简洁的API供用户使用。 门面模式是一种设计模式,它提供了一个统一的接口,使得子系统更加易于使用。在SLF4J中,这个接口就是一系列的日志...

    slf4j日志框架的源代码分享

    SLF4J(Simple Logging...深入研究SLF4J源码可以帮助我们理解其工作原理,更好地利用这个强大的日志门面。对于想要学习日志管理、软件设计模式或想了解如何编写简洁易用的API的开发者来说,SLF4J源码是一个宝贵的资源。

    涵盖SpringBoot的AOP、Slf4j日志门面-springboot-in-action.zip

    接下来,我们来看Slf4j,这是一个日志门面,它提供了一种简单的方式来为我们的应用程序选择合适的日志实现。Slf4j允许开发者在部署时通过Maven或类路径中的桥接器替换日志实现,如Log4j、Logback等。使用Slf4j的好处...

    浅谈SpringBoot是如何实现日志的

    让系统中所有的日志都统一到 SLF4j 的做法是将系统中其他日志框架的日志实现统一到 SLF4j 中,然后使用 SLF4j 来打印日志。这样可以减少系统中的日志实现复杂度,提高系统的可维护性。 在使用 SLF4j 时,需要注意的...

    spring 开发文档

    - **使用SLF4J**:SLF4J作为日志门面,可以与多种实际日志实现无缝集成。 - **使用Log4J**:传统的日志实现,仍被广泛使用。 #### 二、Spring 4.x的新特性 ##### 2.1 显著改进 - **改善的入门体验**:通过简化...

    mybatis+springMVC所需jar包完整

    8. slf4j-api-x.x.x.jar和slf4j-log4j12-x.x.x.jar:简单日志门面SLF4J和它的Log4j实现,用于记录应用日志。 9. log4j-x.x.x.jar:Log4j库,提供灵活的日志记录功能。 10. jstl-x.x.x.jar和taglibs-standard-x.x.x....

    手动搭建SSH框架所需27个jar包

    - `slf4j-api.jar` 和 `slf4j-log4j12.jar`,SLF4J是日志门面,可绑定到多种日志实现,如Log4j。 - `commons-lang3.jar`,Apache Commons提供的语言工具类库。 - `commons-io.jar`,处理I/O操作。 - `commons-...

    搭建SSH2框架相关jar包

    SSH2的运行还需要一些基础库,如`log4j.jar`用于日志记录,`commons-logging.jar`提供日志接口,`javassist.jar`是Hibernate的动态代理库,`slf4j-api.jar`和`slf4j-log4j12.jar`是简单日志门面(SLF4J)的实现,`...

    Spring所需jar包

    9. slf4j-api:简单日志门面,可以适配多种日志实现。 10. logback-classic:一种常用的日志实现,配合SLF4J使用。 这些jar包的集合为搭建一个基于Spring4.0和Mybatis3.0的应用程序提供了所有必需的依赖。在实际...

    SSM框架——详细整合教程(Spring+SpringMVC+MyBatis)

    -- SLF4J 日志门面 --&gt; &lt;groupId&gt;org.slf4j &lt;artifactId&gt;slf4j-log4j12 ${slf4j.version} ``` ##### 3.2 配置文件 在整合过程中,通常会使用两个主要的配置文件: - **spring-mybatis.xml**: 包含 Spring ...

    spring-framework-reference-4.0.0

    - **使用SLF4J**:SLF4J是一个日志门面,可以方便地切换底层的日志实现,如Logback或Log4j。 - **使用Log4J**:Log4J是一个成熟的日志框架,文档提供了如何配置Log4J以配合Spring使用的示例。 #### Spring 4.x的新...

    Spring4.X最新帮助文档带视图结构树的

    - **使用SLF4J:** SLF4J是一个日志门面,用于抽象不同的日志实现。 - **使用Log4J:** Log4J是Apache的一个开源日志框架,广泛应用于Java应用程序中。 #### II. Spring 4.x的新特性和增强功能 **3. Spring 4.0...

    尚学堂ssh项目hibernate、spring需要的jar包

    4. 其他依赖库,如`commons-logging.jar`, `log4j.jar`,用于日志记录,还有可能包括`javassist.jar`(Hibernate的字节码处理库)和`slf4j-api.jar`(简单日志门面)等。 学习SSH项目时,这些jar包是必不可少的,...

    SSH 中jar包说明

    - **用途**:SLF4J(Simple Logging Facade for Java)是一个日志门面库。 - **作用**:为不同的日志实现提供了一个统一的接口,便于日志框架的切换。 #### 36. **standard-1.1.2.jar** - **用途**:通常指JSTL...

Global site tag (gtag.js) - Google Analytics