学习了一下JAVA的日志系统slf4j ,这是日志的一个接口。
通过这个接口,我们可以方便的切换日志的实现框架,比如log4j,commons-logging,logback,jdk-log 等等。
slf4j的API在 slf4j-api.jar中,核心接口与类是:
org.slf4j.Logger
org.slf4j.LoggerFactory
slf4j的实际调用日志在运行时才会动态绑定,基本原理是查找classpath下面的jar包,如果存在slf4j的实现框架,就采用该实现框架。参考下图:
下面分析一下slf4j如何实现运行时的动态绑定日志实现框架
以下代码是org.slf4j.LoggerFactory中的部分
// We need to use the name of the StaticLoggerBinder class, we can't reference
// the class itseld.
private static String STATIC_LOGGER_BINDER_PATH = "org/slf4j/impl/StaticLoggerBinder.class";
private static void singleImplementationSanityCheck() {
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);
}
List implementationList = new ArrayList();
while (paths.hasMoreElements()) {
URL path = (URL) paths.nextElement();
implementationList.add(path);
}
if (implementationList.size() > 1) {
Util.report("Class path contains multiple SLF4J bindings.");
for (int i = 0; i < implementationList.size(); i++) {
Util.report("Found binding in [" + implementationList.get(i) + "]");
}
Util.report("See " + MULTIPLE_BINDINGS_URL + " for an explanation.");
}
} catch (IOException ioe) {
Util.report("Error getting resources from path", ioe);
}
}
我们的日志系统lib中有一个日志API:slf4j-api.jar,以及不少于一个日志框架(比如log4j,commons-logging等等)
程序运行过程中到底会使用哪个日志框架(log4j or commons-logging)呢。
这个中间需要一个API -> 实现框架的桥梁: 对接包
上面代码可以看出,通过ClassLoader来查找资源"org/slf4j/impl/StaticLoggerBinder.class",
如果有1个资源,这个就是日志实现库对接包了。如果有多个资源,则警告classpath路径下有多个slf4j的实现框架对接包。
那如果有多个实现框架对接包的情况下,到底会用哪个实现框架呢?这个就靠ClassLoader先加载到哪个了,不能确定。
因此不要在classpath下放入多个slf4j的实现框架对接包,避免出错。
上面说到关键的类StaticLoggerBinder.class,这个是判断采用哪个slf4j实现框架的关键。
StaticLoggerBinder类是slf4j组织来写的,目的是为了对接不同的日志框架。
如上图所示,slf4j-log12-xxx.jar slf4j-jdk14-xxx.jar 之类jar中就包含StaticLoggerBinder类。
实际中至少需要在classpath下提供一个实现框架,以及不多于一个对应的对接包
slf4j还有一个功能是,可以方便的迁移不同的日志框架。
比如一个项目是使用commons-logging框架来写日志的。
我们需要迁移到log4j框架来,如何处理呢。
使用slf4j将会非常方便,我们只需要做三步:
1.删除原有的commons-logging包
2.将log4j的jar加入到classpath
3.引入一个日志转换的jar,在这里是jcl-over-slf4j.jar
下面分析一下以上步骤的实现原理
commons-logging框架中的几个核心类是:
org.apache.commons.logging.Log
org.apache.commons.logging.LoggerFactory
老项目采用了commons-logging框架,必然会耦合这几个类,比如使用了如下代码:
org.apache.commons.logging.Log.error("errror msg");
要想使以上代码正常运行,而又实际是调用log4j来处理。这里就需要用到jcl-over-slf4j.jar了
jcl-over-slf4j.jar实际上是覆写了commons-logging中的几个核心类,内部采用类Adaptor,对接到了slf4j的API上面。
即jcl-over-slf4j中也有 org.apache.commons.logging.Log这个类, 他与原生的类完全不同,仅仅是适配到了slf4j-api上。
因为jcl-over-slf4j.jar是slf4j出品,slf4j把代码写到了不属于他们的package下面,感觉有点山寨,怪怪的。
这里只是举例commons-logging -> log4j, 其他的转换也类似,只是需要下载不同的适配包
整理一下日志框架迁移的流程
老日志框架:类比与上例的common-logging代码
新日志框架:类比与上例的log4j
适配包:类比与上例的jcl-over-slf4j.jar
对接包:类比与上上例的slf4j-log4j12-xxx.jar
老日志框架 ---(适配包)---> SLF4J API ---(对接包)---> 新日志框架
- 大小: 71.9 KB
分享到:
相关推荐
2. `slf4j-jdk14-1.5.6.jar`:这是一个适配器模块,它使得Slf4j可以使用Java内置的日志系统(java.util.logging)作为其后台日志框架。如果你的应用环境中已经使用了Java内置的日志,那么这个适配器可以让Slf4j无缝...
总结,SLF4J是Java日志管理的重要工具,通过提供统一的API,使得开发者可以在不改变代码的情况下灵活选择或切换日志实现。结合Log4j,我们可以实现强大的日志记录功能,方便调试和监控应用程序。在具体项目中,配置...
1. 兼容性强:Slf4j可以与多种日志系统集成,如Log4j、Logback、Java Util Logging等。 2. 灵活性强:Slf4j提供了统一的日志接口,使得用户可以选择不同的日志实现。 3. 高性能:Slf4j可以在高并发情况下提供高性能...
总之,SLF4J作为Java日志的标准之一,以其简洁的API、强大的功能和高度的灵活性,为开发者提供了高效、便捷的日志处理方案。通过SLF4J,我们可以轻松地在不同的日志框架之间切换,同时保持代码的整洁和一致性。在...
在IT行业中,日志记录是系统调试、故障排查和性能分析的重要工具。本文将深入探讨“调试日志之slf4j+...文档《复件 日志系统.docx》可能包含了更多关于如何配置和使用SLF4J+Logback的详细信息,建议进一步查阅学习。
Log4j和SLF4J(Simple Logging Facade for Java)是Java领域广泛使用的两个日志框架,它们有着各自的特点和用途。下面将详细阐述这两个框架以及它们在给定压缩包中的具体组件。 首先,Log4j是Apache软件基金会的一...
SLF4J(Simple Logging Facade for Java)是Java中的一种日志抽象层,它为各种日志框架,如Log4j、Logback等提供一个简单的接口,使得开发者能够在不改变代码的情况下更换日志实现。在非Web工程中,SLF4J同样扮演着...
slf4j-log4j12-1.7.x版本是SLF4J针对Log4j 1.2版本的绑定器,它使得应用可以使用SLF4J接口,但实际的日志输出通过Log4j进行。这个桥接器让项目能利用SLF4J的灵活性,同时使用Log4j的成熟实现。 在提供的文件名列表...
SLF4J(Simple Logging Facade for Java)是Java中的一种日志门面(Logging Facade),它为各种日志框架提供了一个简单的统一接口,如Log4j、Java Util Logging、Logback等。通过SLF4J,开发者可以在运行时绑定任意...
SLF4J(Simple Logging Facade for Java)是Java中的一种日志门面(Logging Facade),它为各种日志框架提供了一个简单的统一接口,如Log4j、Java Util Logging、Logback等。这个jar包是SLF4J的核心组件,用于在应用...
总的来说,SLF4J的出现使得Java日志处理更加规范和模块化,开发者可以根据项目的特性选择最适合的日志实现,同时减少了不同日志库之间的代码冲突。通过使用SLF4J,我们可以编写出更加简洁、可维护的代码,提高了项目...
SLF4J提供了一种机制,通过在类路径中放置特殊的“禁止”JAR(如jul-to-slf4j.jar),可以防止Java Util Logging(JUL)等其他日志框架的直接使用,从而保持日志系统的统一。 标签"slf4j"表明了这两个JAR文件与SLF4...
SLF4J(Simple Logging Facade for Java)是Java中的一种日志抽象层,它为各种日志框架提供了一个统一的API,如Log4j、Java Util Logging、Logback等。这个API允许开发者在部署应用时选择合适的日志实现,而无需修改...
SLF4J提供了一套简单的API,用于编写日志语句,然后在运行时通过绑定具体的日志实现(如Log4j、Java内置的日志系统等)来决定日志的行为。 Logback则是由Log4j的创始人Ceki Gülcü开发的一个更现代、更高效的日志...
SLF4J(Simple Logging Facade for Java)是Java中的一种日志抽象层,它提供了一个接口,允许用户在运行时动态地绑定到各种具体的日志框架,如Log4j、Java内置的日志或者Logback等。这个设计使得开发者可以在不修改...
总结来说,SLF4J是一个重要的日志抽象层,它简化了Java日志处理,提高了代码的可维护性和可扩展性。`slf4j-api-1.7.12.jar`和`slf4j-log4j12-1.7.12.jar`分别是SLF4J API和SLF4J到Log4j的绑定,它们共同工作,使...
Slf4j(Simple Logging Facade for Java)是一个用于日志系统的简单 facade,它允许最终用户在部署他们的应用时使用他们希望的日志库。Slf4j提供了一个统一的API,使得开发人员能够在不更换日志实现的情况下,轻松地...
描述中的"slf4j_and_slf4j_simple.png"可能展示了如何使用SLF4J最基础的功能,而"slf4j_and_slf4j_jdk.png"可能涉及了如何将SLF4J与Java内置日志系统集成。"slf4j_and_slf4j-log4j.png"则可能演示了如何配置SLF4J与...
SLF4J(Simple Logging Facade for Java)是Java日志框架的一个抽象层,它的主要目的是为各种日志实现提供一个统一的接口。这使得开发者能够在不修改代码的情况下,自由地选择日志实现,如Log4J、Logback或Java内置...
SLF4J的出现主要是为了解决Java日志API的碎片化问题,让应用的日志配置更加灵活。 标题中的"slf4j-api-1.7.7"指的是SLF4J API的1.7.7版本,它是SLF4J的核心组件,包含了SLF4J的日志API定义。这个库提供了日志记录的...