我如何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
在某些情况下)