`
zy19982004
  • 浏览: 661778 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
博客专栏
F6f66edc-1c1a-3859-b76b-a22e740b7aa7
Hadoop学习
浏览量:251950
社区版块
存档分类
最新评论

Java日志学习四:Simple Logging Facade for Java (SLF4J)源码浅析

 
阅读更多

一.SLF4J

     http://www.slf4j.org/

 

二.SLF4J核心类

  1.  Logger:日志类。
  2. LoggerFactory:负责查找系统里日志的实现,负责创建日志。类似JCL的LogFactory,类似log4j的LogManager。
  3. ILoggerFactory:该接口只有一个getLogger(name)方法。类似log4j的LoggerRepository 。
  4. LoggerFactoryBinder:该接口可以ILoggerFactory getLoggerFactory()。累世log4j的RepositorySelector。
  5. StaticLoggerBinder:实现LoggerFactoryBinder接口。LoggerFactory在查找日志的实现时,会调用StaticLoggerBinder的getSingleton()方法来判断系统里存在的日志实现。

三.Logger初始化

  1. LoggerFactory的getILoggerFactory方法首先执行performInitialization()。
      1. performInitialization调用bind()完成最核心的一段代码:静态查找日志实现类。怎么做的,StaticLoggerBinder.getSingleton(),就这么简单,如果没有异常说明找到了日志实现类,设置INITIALIZATION_STATE为SUCCESSFUL_INITIALIZATION;如果有异常,根据异常信息设置INITIALIZATION_STATE,如果是java.lang.ClassNotFoundException: org.slf4j.impl.StaticLoggerBinder,设置INITIALIZATION_STATE = NOP_FALLBACK_INITIALIZATION;找不到方法异常设置INITIALIZATION_STATE = FAILED_INITIALIZATION。
      2. bind()返回后,performInitialization()方法会再做一些版本检查,即StaticLoggerBinder可以定义一个静态的REQUESTED_API_VERSION字段,表示该StaticLoggerBinder支持的SLF4J版本,如果该版本不在LoggerFactory定义的兼容版本列表中(API_COMPATIBILITY_LIST),SLF4J会打印警告信息,并列出当前LoggerFactory兼容的版本列表。
  2. 执行完performInitialization后根据INITIALIZATION_STATE,返回对应ILoggerFactory实例。如果为SUCCESSFUL_INITIALIZATION返回绑定的StaticLoggerBinder中的ILoggerFactory实例;如果为NOP_FALLBACK_INITIALIZATION(没有找到桥接jar),则返回NOPLoggerFactory,它返回一个单例的NOPLogger实例,该类不会打印任何日志;如果初始化状态为FAILED_INITIALIZATION,抛出IllegalStateException异常;如果初始化状态为ONGOING_INITIALIZATION,则返回SubstituteLoggerFactory类实例,该状态发生在一个线程正在初始化LoggerFactory,而另一个线程已经开始请求获取ILoggerFactory实例,SubstituteLoggerFactory会记录当前请求的Logger名称,然后返回NOPLogger实例。所有这些在LoggerFactory初始化时被忽略的Logger Name会在LoggerFactory初始化成功以后被report出来(在System.err流中打印出来)。
    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");
      }
     
  3. 得到ILoggerFactory后调用ILoggerFactory.getLogger(name)返回Logger实例。如果使用slf4j作为日志实现,则得到一个org.slf4j.impl.SimpleLogger = org.slf4j.impl.SimpleLoggerFactory.getLogger(name)。SimpleLogger 定义了五个日志级别:TRACEDEBUGINFOWARNERROR。SimpleLogger还支持对classpath下的simplelogger.properties配置文件的解析,不过我们好像基本没用到这个。根据以往的经验,都是先从系统属性里查找这些属性,找不到再去simplelogger.properties查找,当然,SimpleLogger 就是这么做的。
      public static final String SYSTEM_PREFIX = "org.slf4j.simpleLogger.";
    
      public static final String DEFAULT_LOG_LEVEL_KEY = SYSTEM_PREFIX + "defaultLogLevel";
      public static final String SHOW_DATE_TIME_KEY = SYSTEM_PREFIX + "showDateTime";
      public static final String DATE_TIME_FORMAT_KEY = SYSTEM_PREFIX + "dateTimeFormat";
      public static final String SHOW_THREAD_NAME_KEY = SYSTEM_PREFIX + "showThreadName";
      public static final String SHOW_LOG_NAME_KEY = SYSTEM_PREFIX + "showLogName";
      public static final String SHOW_SHORT_LOG_NAME_KEY = SYSTEM_PREFIX + "showShortLogName";
      public static final String LOG_FILE_KEY = SYSTEM_PREFIX + "logFile";
      public static final String LEVEL_IN_BRACKETS_KEY = SYSTEM_PREFIX + "levelInBrackets";
      public static final String WARN_LEVEL_STRING_KEY = SYSTEM_PREFIX + "warnLevelString";
     

 

三.定义自己的日志实现

     如果我们想以slf4j作为门面,实现一个自己的日志系统,我们需要一下三点,就这么简单。

  1. MyLogger implements  org.slf4j.Logger。
  2. MyFactory implements org.slf4j.ILoggerFactory。重写MyLogger getLogger()方法。
  3. StaticLoggerBinder implements org.slf4j.spi.LoggerFactoryBinder,这里名称必须是StaticLoggerBinder ,并且提供static getSingleton()方法,并且getLoggerFactory()方法里返回MyFactory 。

      看看log4j是怎么做的。参考slf4j-log4j12-1.7.5.jar源码。slf4j-log4j12-1.7.5.jar pom会依赖log4j。

  1. org.apache.log4j.Logger log4jLogger已经存在。
  2. Log4jLoggerFactory implements org.slf4j.ILoggerFactory。重写了org.apache.log4j.Logger getLogger()方法。返回的是包装了log4jLogger的一个Log4jLoggerAdapter。new Log4jLoggerAdapter(log4jLogger)。
  3. StaticLoggerBinder implements org.slf4j.spi.LoggerFactoryBinder,getLoggerFactory()方法返回Log4jLoggerFactory 。

 

分享到:
评论

相关推荐

    slf4j-api-1.7.2.jar

    The Simple Logging Facade for Java (SLF4J) serves as a simple facade or abstraction for various logging frameworks (e.g. java.util.logging, logback, log4j) allowing the end user to plug in the desired...

    slf4j日志框架的源代码分享

    SLF4J(Simple Logging Facade for Java)是Java中的一种日志门面(Logging Facade),它为各种日志框架提供了一个简单的统一接口,如Log4j、Java Util Logging、Logback等。通过SLF4J,开发者可以在运行时绑定任意...

    slf4j-Logging

    slf4j:Simple Logging Facade for Java,为java提供的简单日志Facade。Facade:门面,更底层一点说就是接口。他允许用户以自己的喜好,在工程中通过slf4j接入不同的日志系统。更直观一点,slf4j是个数据线,一端...

    SLF4J全称为Simple Logging Facade for Java (简单日志门面),作为各种日志框架的简单门面或者抽

    slf4j-log4j12-1.7.32.jar:用于绑定 1.2版的log4j , 这是一个广泛使用的日志系统,当然你还要把log4j包加到classpath中slf4j-jdk14-1.7.32.jar:用于绑定 java.util.logging, 作为JDK 1.4 的loggingslf4j-simple-...

    simple log facade for java

    SLF4J(Simple Logging Facade for Java)是Java中的一种日志抽象层,它为各种日志框架提供了一个统一的接口,例如Log4j、Java Util Logging (JUL)、Logback等。这个设计使得开发者可以在不修改代码的情况下更换底层...

    log4j-slf4j-impl-2.17.1-API文档-中英对照版.zip

    标签:apache、logging、log4j、slf4j、impl、中英对照文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和...

    log4j-to-slf4j-2.12.1-API文档-中文版.zip

    标签:apache、logging、log4j、slf4j、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明精准...

    Java Slf4j依赖包

    Java Slf4j,全称为Simple Logging Facade for Java,是一个为各种日志框架提供一个简单统一的接口,使得最终用户能够在部署时配置他们希望的日志框架。Slf4j允许开发者在部署应用时插入所需的日志实现,无需修改...

    log4j-to-slf4j-2.17.1-API文档-中文版.zip

    标签:apache、slf4j、logging、log4j、jar包、java、中文文档; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明精准...

    slf4j与commons-logging处理日志

    SLF4J(Simple Logging Facade for Java)和Apache Commons Logging是两个在Java开发中广泛使用的日志框架。它们提供了一种抽象层,允许开发者在不修改代码的情况下切换不同的日志实现,如Log4j、Java Util Logging ...

    log4j + slf4j-api + slf4j-log4j12

    在给定的标题和描述中,我们看到了两个关键的日志框架——`log4j`和`SLF4J(Simple Logging Facade for Java)`,以及它们之间的桥接器`slf4j-log4j12`。这些组件是Java日志处理的常用工具,让我们详细了解一下它们...

    slf4j jar包

    SLF4J(Simple Logging Facade for Java)是Java中的一种日志门面(Logging Facade),它为各种日志框架提供了一个简单的统一接口,如Log4j、Java Util Logging、Logback等。这个jar包是SLF4J的核心组件,用于在应用...

    java slf4j

    SLF4J(Simple Logging Facade for Java)是Java中的一种日志门面(Logging Facade),它为各种日志框架提供了一个简单的统一接口,如Log4j、Java Util Logging、Logback等。通过SLF4J,开发者可以在运行时绑定任意...

    log4j-to-slf4j-2.17.1-API文档-中英对照版.zip

    标签:apache、slf4j、logging、log4j、jar包、java、中英对照文档; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明...

    log4j-to-slf4j-2.10.0-API文档-中文版.zip

    标签:apache、slf4j、logging、log4j、jar包、java、API文档、中文版; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明...

    log4j-to-slf4j-2.14.1-API文档-中文版.zip

    标签:apache、logging、log4j、slf4j、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明精准...

    slf4j完整日志文件

    SLF4J(Simple Logging Facade for Java)是Java中的一种日志门面(Logging Facade),它为各种日志框架提供了一个简单的统一接口,如Log4j、Java Util Logging (JUL)、Logback等。这个接口允许最终用户在部署时插入...

    Slf4j日志相关jar包

    Slf4j(Simple Logging Facade for Java)是一个用于日志系统的简单 facade,它允许最终用户在部署他们的应用时使用他们希望的日志库。Slf4j提供了一个统一的API,使得开发人员能够在不更换日志实现的情况下,轻松地...

    slf4j 1.7 所有jar包

    SLF4J(Simple Logging Facade for Java)是Java中的一种日志抽象层,它提供了一个简单的API,允许开发者在应用程序中使用各种日志框架,如Log4j、Logback等,而无需直接依赖特定的日志实现。SLF4J 1.7是其的一个...

    slf4j 1.6.1所有jar包

    SLF4J(Simple Logging Facade for Java)是Java日志框架的一个抽象层,它提供了一个统一的API,允许开发者在运行时选择合适的日志实现。这个“slf4j 1.6.1所有jar包”包含了SLF4J API和其他绑定实现,包括slf4j-api...

Global site tag (gtag.js) - Google Analytics