如何配置Spring和SLF4J以便我可以获取日志记录?

时间:2010-08-02 11:53:32

标签: java spring logging log4j slf4j

我有一个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了,找不到设置它的简单示例。有什么想法吗?

7 个答案:

答案 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进行某些情况)