我有一个maven&我想登录的Spring应用程序。我很想使用SLF4J。
我想将所有配置文件放入目录{classpath} / config,包括log4j.xml,然后使用spring bean初始化。
e.g。
<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>
然而,我收到此警告并且没有记录。
log4j:WARN找不到logger(org.springframework.context.support.ClassPathXmlApplicationContext)的appender。 log4j:WARN请正确初始化log4j系统。 log4j:WARN有关详细信息,请参阅http://logging.apache.org/log4j/1.2/faq.html#noconfig。
我已经google了,找不到设置它的简单示例。有什么想法吗?
答案 0 :(得分:46)
除了贾丁的回答:
Spring使用Jakarta Commons Logging作为日志记录API。要记录到slf4j,您需要确保commons-logging
不在类路径上。 jcl-over-slf4j
是公共记录的替代jar。
如果您正在使用maven,则可以使用mvn dependency:tree
检测公共日志记录的来源,并使用依赖项排除将其排除在需要它的所有依赖项之外。您可能需要多次运行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>
答案 1 :(得分:27)
你会在https://github.com/mbogoevici/spring-samples/tree/master/mvc-basic/trunk找到一个例子。您需要在POM文件中包含一些依赖项以启用日志记录。
<!-- 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>
答案 2 :(得分:6)
为了完整起见,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>
不要忘记禁用commons-logging
依赖,它会像Spring(Stijn)的答案一样从Spring依赖中萌芽。
答案 3 :(得分:5)
使用点击配置在JCL API
上实施classpath
:
<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>
了解更多信息,请查看here
答案 4 :(得分:1)
将log4j文件保留在默认包
中答案 5 :(得分:1)
我喜欢logback方式,对于slf4j,我们做类似的配置:
<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,所以不需要放这么多的依赖项
答案 6 :(得分:0)
只需添加lazy-init="false"
即可在根上下文中为log4j配置急切加载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中将配置或作为JVM参数(-Dlog4j.configuration=.../conf/log4j.xml
或使用'file:'前缀作为-Dlog4j.configuration=file:conf/log4j.properties
进行某些情况)