我如何configurationSpring和SLF4J,以便能够logging日志?

我有一个我想login的maven&spring应用程序。我很想使用SLF4J。

我想把我所有的configuration文件放到一个目录{classpath} / config中,包括log4j.xml,然后使用spring bean进行init。

例如

<bean id="log4jInitialization" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"> <property name="targetClass" value="org.springframework.util.Log4jConfigurer"/> <property name="targetMethod" value="initLogging"/> <property name="arguments"> <list> <value>classpath:config/log4j.xml</value> </list> </property> </bean> 

但是,我得到这个警告,并没有logging。

log4j:WARNlogging器(org.springframework.context.support.ClassPathXmlApplicationContext)找不到appender。 log4j:WARN请正确初始化log4j系统。 log4j:WARN请参阅http://logging.apache.org/log4j/1.2/faq.html#noconfig了解更多信息。

我search了一下,找不到一个简单的例子来设置这个。 有任何想法吗?

除了Jatin的回答:

Spring使用Jakarta Commons Logging作为日志API。 为了login到slf4j,你需要确保commons-logging不在类path中。 jcl-over-slf4j是commons-logging的replacejar。

如果您使用的是maven,那么您可以使用mvn dependency:tree来检测commons-logging的来源,并使用dependency exclusions将其从所有需要它的依赖项中排除。 您可能需要多次运行mvn dependency:tree ,因为它只显示传递依赖关系的第一次出现。

 <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${org.springframework.version}</version> <exclusions> <exclusion> <artifactId>commons-logging</artifactId> <groupId>commons-logging</groupId> </exclusion> </exclusions> </dependency> 

你会在https://github.com/mbogoevici/spring-samples/tree/master/mvc-basic/trunkfind一个例子。; 您需要在POM文件中包含一些依赖项来启用日志logging。

 <!-- Logging --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>${org.slf4j.version}</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>jcl-over-slf4j</artifactId> <version>${org.slf4j.version}</version> <scope>runtime</scope> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>${org.slf4j.version}</version> <scope>runtime</scope> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.16</version> <scope>runtime</scope> </dependency> 

只是为了完整性,一个logback-classic变体:

  <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.0.0</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>jcl-over-slf4j</artifactId> <version>1.6.6</version> <scope>runtime</scope> </dependency 

不要忘记,如在公认的(Stijn's)答案中, 禁用从Spring依赖关系中萌芽的commons-logging依赖关系

classpath使用blowconfiguration来实现JCL API

 <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>3.0.0.RELEASE</version> <scope>runtime</scope> <exclusions> <exclusion> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>jcl-over-slf4j</artifactId> <version>1.5.8</version> <scope>runtime</scope> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.5.8</version> <scope>runtime</scope> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.5.8</version> <scope>runtime</scope> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.14</version> <scope>runtime</scope> </dependency> </dependencies> 

更多信息请点击这里

将log4j文件保存在默认包中

我喜欢logback方式,对于slf4j,我们做类似的configuration:

  <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>jcl-over-slf4j</artifactId> </dependency> 

slf4j-log4j12会自动引入slf4j-api和log4j,所以不需要放太多依赖

只需添加lazy-init="false"以便在根上下文中为log4jconfiguration急切加载bean。 这应该解决WARN消息log4j:WARN No appenders could be found for logger

例:

 <bean id="log4jInitialization" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean" lazy-init="false"> 

更好的方法是在web.xml中configuration或作为JVM参数( -Dlog4j.configuration=.../conf/log4j.xml或使用'file:'前缀作为-Dlog4j.configuration=file:conf/log4j.properties在某些情况下)