从我在示例springpom.xml文件中看到的情况来看,它们为slf4j和log4j添加了一些条目,并且当您在spring应用程序中使用log4j时,它将被slf4j库 Package 。谁能给我解释一下这是怎么神奇地发生的?
mi7gmzs61#
Spring仍然使用commons-logging进行所有内部日志记录(向后兼容性)。如果您希望使用其他日志记录框架(log4j),则需要桥接从commons logging到您选择的框架的调用。否则,您将不得不维护多个日志记录配置。slf4j充当各种日志框架(jul、log4j、jcl、logback)的简单外观,并允许您在部署时插入所需的日志框架。与使用第三方框架强加的日志框架实现不同,您提供了slf4j's桥实现,该实现的行为类似于真实的情况,但实际上只是将日志调用转发到slf4j或其具体绑定。Maven pom.xml的日志记录部分通常如下所示:
Spring
commons-logging
log4j
commons logging
slf4j
jul
jcl
logback
slf4j's
<!-- remove the real commons-logging from classpath --> <!-- declare as provided or exclude from spring jars --> <dependency> <artifactId>commons-logging</artifactId> <groupId>commons-logging</groupId> <version>1.0</version> <scope>provided</scope> </dependency> <!-- add slf4j interfaces to classpath --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.6.4</version> <scope>compile</scope> </dependency> <!-- add commons logging to slf4j bridge to classpath --> <!-- acts as jcl but routes commons-logging calls to slf4j --> <dependency> <groupId>org.slf4j</groupId> <artifactId>jcl-over-slf4j</artifactId> <version>1.6.4</version> <scope>runtime</scope> </dependency> <!-- add log4j binding to classpath --> <!-- routes slf4j calls to log4j --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.6.4</version> <scope>runtime</scope> </dependency> <!-- add log4j to classpath --> <!-- does the logging --> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.16</version> </dependency>
这与Spring容器无关,也与依赖注入无关,它是纯粹的类路径、类加载器的东西...请参阅thefollowing链接以了解更多详细信息。
brgchamk2#
slf4j是一个日志记录API,它什么都不做,只是一堆接口。log4j是一个日志记录系统,有具体的类。有一个slf4j-log4j库,它使用log4j作为slf4j API的后端。有些项目显式地依赖于log4j,它们调用具体的类。因此,你不能为你的项目使用另一个后端(例如logback或j.u.l或apache commons或其他),你只明智地使用slf4j API。有a trick通过一个mock实现(桥)来替换log4j类,它只是简单地将所有调用重定向到sl4j。在maven中,你只需要声明一个版本号非常高的依赖项,这个mock被认为是超现代的log4j库。
slf4j-log4j
hs1rzwqc3#
尝试添加:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-log4j2</artifactId> </dependency>
3条答案
按热度按时间mi7gmzs61#
Spring
仍然使用commons-logging
进行所有内部日志记录(向后兼容性)。如果您希望使用其他日志记录框架(log4j
),则需要桥接从commons logging
到您选择的框架的调用。否则,您将不得不维护多个日志记录配置。slf4j
充当各种日志框架(jul
、log4j
、jcl
、logback
)的简单外观,并允许您在部署时插入所需的日志框架。与使用第三方框架强加的日志框架实现不同,您提供了
slf4j's
桥实现,该实现的行为类似于真实的情况,但实际上只是将日志调用转发到slf4j
或其具体绑定。Maven pom.xml的日志记录部分通常如下所示:
这与Spring容器无关,也与依赖注入无关,它是纯粹的类路径、类加载器的东西...
请参阅thefollowing链接以了解更多详细信息。
brgchamk2#
slf4j
是一个日志记录API,它什么都不做,只是一堆接口。log4j
是一个日志记录系统,有具体的类。有一个slf4j-log4j
库,它使用log4j作为slf4j API的后端。有些项目显式地依赖于log4j,它们调用具体的类。因此,你不能为你的项目使用另一个后端(例如logback或j.u.l或apache commons或其他),你只明智地使用slf4j API。
有a trick通过一个mock实现(桥)来替换log4j类,它只是简单地将所有调用重定向到sl4j。在maven中,你只需要声明一个版本号非常高的依赖项,这个mock被认为是超现代的log4j库。
hs1rzwqc3#
尝试添加: