如何简单地将slf4j添加到pom.xml包装log4j?

时间:2011-12-29 15:58:19

标签: spring log4j slf4j

从我在示例中看到的春天pom.xml文件是,他们为slf4j和log4j添加了一些条目,不知何故,当你在spring应用程序中使用log4j时,它将被slf4j库包装。

有人可以向我解释这是如何神奇地发生的吗?

2 个答案:

答案 0 :(得分:29)

Spring仍然使用commons-logging进行所有内部日志记录(向后兼容)。 如果您希望使用其他一些日志记录框架(log4j),则需要桥接commons logging到您选择的框架的调用。否则,您将不得不维护多个日志记录配置。

slf4j充当各种日志框架(jullog4jjcllogback)的简单外观,并允许您插入所需的部署时记录框架。

您可以提供slf4j's桥接实现,而不是使用第三方框架强加的日志框架实现,这种实现就像真实的一样,但实际上只是将日志记录调用转发给slf4j或其具体的结合。

Maven pom.xml的日志记录部分通常如下所示:

<!-- 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容器无关,也没有依赖注入,它是纯类路径,类加载器的东西......

有关详细信息,请参阅the following个链接。

答案 1 :(得分:4)

slf4j是一个日志API,它不做任何事情,只是一堆接口。 log4j是一个具有特定类的日志系统。有一个slf4j-log4j库,它使用log4j作为slf4j API的后端。

某些项目明确依赖于log4j,它们调用具体的类。因此,您不能使用另一个后端(例如logback或j.u.l或apache commons或其他)来为您明智地使用slf4j API制作的项目。

通过模拟实现(桥接)替换log4j类有a trick,它只是简单地将所有调用重定向到sl4j。在maven中,您只需声明一个具有非常高版本号的依赖项,并将此模拟视为超现代的log4j库。