一.SLF4J
二.SLF4J核心类
- Logger:日志类。
- LoggerFactory:负责查找系统里日志的实现,负责创建日志。类似JCL的LogFactory,类似log4j的LogManager。
- ILoggerFactory:该接口只有一个getLogger(name)方法。类似log4j的LoggerRepository 。
- LoggerFactoryBinder:该接口可以ILoggerFactory getLoggerFactory()。累世log4j的RepositorySelector。
- StaticLoggerBinder:实现LoggerFactoryBinder接口。LoggerFactory在查找日志的实现时,会调用StaticLoggerBinder的getSingleton()方法来判断系统里存在的日志实现。
三.Logger初始化
- LoggerFactory的getILoggerFactory方法首先执行performInitialization()。
- 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。
- 在bind()返回后,performInitialization()方法会再做一些版本检查,即StaticLoggerBinder可以定义一个静态的REQUESTED_API_VERSION字段,表示该StaticLoggerBinder支持的SLF4J版本,如果该版本不在LoggerFactory定义的兼容版本列表中(API_COMPATIBILITY_LIST),SLF4J会打印警告信息,并列出当前LoggerFactory兼容的版本列表。
- 执行完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"); }
- 得到ILoggerFactory后调用ILoggerFactory.getLogger(name)返回Logger实例。如果使用slf4j作为日志实现,则得到一个org.slf4j.impl.SimpleLogger = org.slf4j.impl.SimpleLoggerFactory.getLogger(name)。SimpleLogger 定义了五个日志级别:TRACE、DEBUG、INFO、WARN、ERROR。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作为门面,实现一个自己的日志系统,我们需要一下三点,就这么简单。
- MyLogger implements org.slf4j.Logger。
- MyFactory implements org.slf4j.ILoggerFactory。重写MyLogger getLogger()方法。
- 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。
- org.apache.log4j.Logger log4jLogger已经存在。
- Log4jLoggerFactory implements org.slf4j.ILoggerFactory。重写了org.apache.log4j.Logger getLogger()方法。返回的是包装了log4jLogger的一个Log4jLoggerAdapter。new Log4jLoggerAdapter(log4jLogger)。
- StaticLoggerBinder implements org.slf4j.spi.LoggerFactoryBinder,getLoggerFactory()方法返回Log4jLoggerFactory 。
相关推荐
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(Simple Logging Facade for Java)是Java中的一种日志门面(Logging Facade),它为各种日志框架提供了一个简单的统一接口,如Log4j、Java Util Logging、Logback等。通过SLF4J,开发者可以在运行时绑定任意...
slf4j:Simple Logging Facade for Java,为java提供的简单日志Facade。Facade:门面,更底层一点说就是接口。他允许用户以自己的喜好,在工程中通过slf4j接入不同的日志系统。更直观一点,slf4j是个数据线,一端...
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-...
SLF4J(Simple Logging Facade for Java)是Java中的一种日志抽象层,它为各种日志框架提供了一个统一的接口,例如Log4j、Java Util Logging (JUL)、Logback等。这个设计使得开发者可以在不修改代码的情况下更换底层...
标签:apache、logging、log4j、slf4j、impl、中英对照文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和...
标签:apache、logging、log4j、slf4j、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明精准...
Java Slf4j,全称为Simple Logging Facade for Java,是一个为各种日志框架提供一个简单统一的接口,使得最终用户能够在部署时配置他们希望的日志框架。Slf4j允许开发者在部署应用时插入所需的日志实现,无需修改...
标签:apache、slf4j、logging、log4j、jar包、java、中文文档; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明精准...
SLF4J(Simple Logging Facade for Java)和Apache Commons Logging是两个在Java开发中广泛使用的日志框架。它们提供了一种抽象层,允许开发者在不修改代码的情况下切换不同的日志实现,如Log4j、Java Util Logging ...
在给定的标题和描述中,我们看到了两个关键的日志框架——`log4j`和`SLF4J(Simple Logging Facade for Java)`,以及它们之间的桥接器`slf4j-log4j12`。这些组件是Java日志处理的常用工具,让我们详细了解一下它们...
SLF4J(Simple Logging Facade for Java)是Java中的一种日志门面(Logging Facade),它为各种日志框架提供了一个简单的统一接口,如Log4j、Java Util Logging、Logback等。这个jar包是SLF4J的核心组件,用于在应用...
SLF4J(Simple Logging Facade for Java)是Java中的一种日志门面(Logging Facade),它为各种日志框架提供了一个简单的统一接口,如Log4j、Java Util Logging、Logback等。通过SLF4J,开发者可以在运行时绑定任意...
标签:apache、slf4j、logging、log4j、jar包、java、中英对照文档; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明...
标签:apache、slf4j、logging、log4j、jar包、java、API文档、中文版; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明...
标签:apache、logging、log4j、slf4j、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明精准...
SLF4J(Simple Logging Facade for Java)是Java中的一种日志门面(Logging Facade),它为各种日志框架提供了一个简单的统一接口,如Log4j、Java Util Logging (JUL)、Logback等。这个接口允许最终用户在部署时插入...
Slf4j(Simple Logging Facade for Java)是一个用于日志系统的简单 facade,它允许最终用户在部署他们的应用时使用他们希望的日志库。Slf4j提供了一个统一的API,使得开发人员能够在不更换日志实现的情况下,轻松地...
SLF4J(Simple Logging Facade for Java)是Java中的一种日志抽象层,它提供了一个简单的API,允许开发者在应用程序中使用各种日志框架,如Log4j、Logback等,而无需直接依赖特定的日志实现。SLF4J 1.7是其的一个...
SLF4J(Simple Logging Facade for Java)是Java日志框架的一个抽象层,它提供了一个统一的API,允许开发者在运行时选择合适的日志实现。这个“slf4j 1.6.1所有jar包”包含了SLF4J API和其他绑定实现,包括slf4j-api...