以前用过log4j,只知道简单的使用,是在多人开发的项目中,看到别人使用了,自己才copy过来使用的,但没有深入了解过。前两天开始接触slf4j,据说是一个可以将原有项目中的日志输出框架转换成另外一种新的日志输出框架的第三方开源工具,可以把多个不同项目中的不同日志输出框架通过它转换成同一种输出框架,看了下源码,官网上给了一幅图,如下:
目前它支持过渡的日志框架有jcl、jul和log4j,最终的日志输出框架支持jcl、jul、log4j、logback。
如果你项目中以前是用的log4j作为日志输出框架,想转换成jul,则需要将classpath中原来引用的log4j的jar文件移除,然后添加log4j-over-slf4j-xxx.jar、slf4j-api-xxx.jar、slf4j-jdk14-xxx.jar(xxx指版本号)等三个jar文件即可,项目中的原来的代码都不需要改动,下面简要说一下这三个包的作用:
log4j-over-slf4j-xxx.jar 此包重新实现了log4j.jar包的一些接口,作为桥接器
slf4j-api-xxx.jar 此包是slf4j的api
slf4j-jdk14-xxx.jar 此包是最终选择的日志输出框架
如果原项目中使用的是log4j输出,则使用slf4j桥接之后的最终日志输出框架不能是log4j,源代码中有限制,代码如下:
static { try { Class.forName("org.slf4j.impl.Log4jLoggerFactory"); String part1 = "Detected both log4j-over-slf4j.jar AND slf4j-log4j12.jar on the class path, preempting StackOverflowError. "; String part2 = "See also " + LOG4J_DELEGATION_LOOP_URL + " for more details."; Util.report(part1); Util.report(part2); throw new IllegalStateException(part1 + part2); } catch (ClassNotFoundException e) { // this is the good case } }
slf4j是通过静态绑定来确定最终是由哪个框架进行日志输出(每个框架都实现了org/slf4j/impl/StaticLoggerBinder.class),如果出现多个,则会将第一个加载的类作为日志输出,代码如下:
private static Set findPossibleStaticLoggerBinderPathSet() { // use Set instead of list in order to deal with bug #138 // LinkedHashSet appropriate here because it preserves insertion order during iteration Set staticLoggerBinderPathSet = new LinkedHashSet(); try { ClassLoader loggerFactoryClassLoader = LoggerFactory.class .getClassLoader(); Enumeration paths; if (loggerFactoryClassLoader == null) { paths = ClassLoader.getSystemResources(STATIC_LOGGER_BINDER_PATH); } else { paths = loggerFactoryClassLoader .getResources(STATIC_LOGGER_BINDER_PATH); } while (paths.hasMoreElements()) { URL path = (URL) paths.nextElement(); staticLoggerBinderPathSet.add(path); } } catch (IOException ioe) { Util.report("Error getting resources from path", ioe); } return staticLoggerBinderPathSet; }
它也会报告有哪些被绑定,以及实际被绑定的输出框架
private static void reportMultipleBindingAmbiguity(Set staticLoggerBinderPathSet) { if (isAmbiguousStaticLoggerBinderPathSet(staticLoggerBinderPathSet)) { Util.report("Class path contains multiple SLF4J bindings."); Iterator iterator = staticLoggerBinderPathSet.iterator(); while (iterator.hasNext()) { URL path = (URL) iterator.next(); Util.report("Found binding in [" + path + "]"); } Util.report("See " + MULTIPLE_BINDINGS_URL + " for an explanation."); } } private static void reportActualBinding(Set staticLoggerBinderPathSet) { if (isAmbiguousStaticLoggerBinderPathSet(staticLoggerBinderPathSet)) { Util.report("Actual binding is of type ["+StaticLoggerBinder.getSingleton().getLoggerFactoryClassStr()+"]"); } }
最后会检查版本的兼容性,代码如下:
private final static void versionSanityCheck() { try { String requested = StaticLoggerBinder.REQUESTED_API_VERSION; boolean match = false; for (int i = 0; i < API_COMPATIBILITY_LIST.length; i++) { if (requested.startsWith(API_COMPATIBILITY_LIST[i])) { match = true; } } if (!match) { Util.report("The requested version " + requested + " by your slf4j binding is not compatible with " + Arrays.asList(API_COMPATIBILITY_LIST).toString()); Util.report("See " + VERSION_MISMATCH + " for further details."); } } catch (java.lang.NoSuchFieldError nsfe) { // given our large user base and SLF4J's commitment to backward // compatibility, we cannot cry here. Only for implementations // which willingly declare a REQUESTED_API_VERSION field do we // emit compatibility warnings. } catch (Throwable e) { // we should never reach here Util.report("Unexpected problem occured during version sanity check", e); } }
相关推荐
SLF4J(Simple Logging Facade for Java)是Java中的一种日志抽象层,它为各种日志框架提供了一个统一的接口,例如Log4j、Java Util Logging (JUL)、Logback等。这个设计使得开发者可以在不修改代码的情况下更换底层...
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提供的简单日志Facade。Facade:门面,更底层一点说就是接口。他允许用户以自己的喜好,在工程中通过slf4j接入不同的日志系统。更直观一点,slf4j是个数据线,一端...
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...
在给定的标题和描述中,我们看到了两个关键的日志框架——`log4j`和`SLF4J(Simple Logging Facade for Java)`,以及它们之间的桥接器`slf4j-log4j12`。这些组件是Java日志处理的常用工具,让我们详细了解一下它们...
SLF4J(Simple Logging Facade for Java)是Java中的一种日志门面(Logging Facade),它为各种日志框架提供一个简单的统一接口,使得最终用户能够在部署时插入所需的日志实现。SLF4J的主要目标是允许最终用户在部署...
SLF4J(Simple Logging Facade for Java)是Java中的一种日志门面,它提供了一个接口层,允许用户在运行时插入所需的日志框架。SLF4J的设计目标是为各种日志库提供一个简单统一的API,使得开发者可以在不修改代码的...
Java Slf4j,全称为Simple Logging Facade for Java,是一个为各种日志框架提供一个简单统一的接口,使得最终用户能够在部署时配置他们希望的日志框架。Slf4j允许开发者在部署应用时插入所需的日志实现,无需修改...
SLF4J(Simple Logging Facade for Java)是Java中一个重要的日志抽象层,它为各种日志框架,如Log4j、java.util.logging、Logback等提供了一个统一的接口。通过SLF4J,开发者可以在不修改代码的情况下更换底层的...
首先,slf4j(Simple Logging Facade for Java)是一个用于日志记录的简单 facade,它允许最终用户在部署他们的应用时插入所需的日志框架。slf4j-simple-1.5.2.jar是slf4j的一个简单实现,它提供了一个基础的日志...
SLF4J(Simple Logging Facade for Java)是Java中的一种日志抽象层,它提供了一个接口,允许用户在运行时动态地绑定到各种具体的日志框架,如Log4j、Java内置的日志或者Logback等。这个设计使得开发者可以在不修改...
SLF4J(Simple Logging Facade for Java)是Java日志框架的一个抽象层,它提供了一个统一的API,允许开发者在运行时选择合适的日志实现。这个“slf4j 1.6.1所有jar包”包含了SLF4J API和其他绑定实现,包括slf4j-api...
SLF4J(Simple Logging Facade for Java)是Java中的一种日志抽象层,它提供了一个API,允许开发者在运行时插入所需的日志框架。SLF4J的主要目的是为各种日志框架,如log4j、logback等,提供一个统一的接口,使得...
SLF4J(Simple Logging Facade for Java)是Java中的一种日志抽象层,它为各种日志框架提供了一个统一的API,如Log4j、Java Util Logging、Logback等。这个API允许开发者在部署应用时选择合适的日志实现,而无需修改...
SLF4J(Simple Logging Facade for Java)是一个用于Java编程语言的日志门面框架,它提供了一个简单的抽象层,用以使用各种日志框架,例如java.util.logging、logback和log4j。门面模式的好处在于,开发者可以在不同...
SLF4J(Simple Logging Facade for Java)是Java中的一种日志门面(Logging Facade),它为各种日志框架提供了一个简单的统一接口,如Log4j、Java Util Logging、Logback等。这个jar包是SLF4J的核心组件,用于在应用...
SLF4J(Simple Logging Facade for Java)和Log4j是Java日志处理的两个重要库。在Java应用程序中,日志记录是一项至关重要的任务,它帮助开发者追踪程序运行时的问题,调试代码,以及记录应用程序的重要事件。下面将...
slf4j-reload4j-1.7.36.jar 是 SLF4J (Simple Logging Facade for Java) 的一个绑定模块,用于将 SLF4J 与 reload4j 日志框架相连接。reload4j 是 Apache log4j 1.2.17 的一个分支,目的是为了修复一些安全问题,...
slf4j-nop-2.0.13.jar 是一个与 SLF4J(Simple Logging Facade for Java)相关的库。SLF4J 是一个日志门面(Logger Facade)或者抽象层,它允许用户在部署他们的应用程序时插入所需的日志框架。slf4j-nop 表示 "No ...
SLF4J(Simple Logging Facade for Java)是Java中的一种日志门面,它提供了一个简单的接口,允许开发者在不修改代码的情况下切换不同的日志实现。SLF4J的出现是为了统一各种日志框架,如Log4j、java.util.logging、...