46

我有一个想要登录的 maven 和 spring 应用程序。我热衷于使用 SLF4J。

我想将所有配置文件放入目录 {classpath}/config 中,包括 log4j.xml,然后使用 spring bean 进行初始化。

例如

<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 找不到记录器的附加程序(org.springframework.context.support.ClassPathXmlApplicationContext)。log4j:WARN 请正确初始化 log4j 系统。log4j:WARN 有关详细信息,请参阅http://logging.apache.org/log4j/1.2/faq.html#noconfig

我用谷歌搜索,找不到一个简单的例子来设置它。有任何想法吗?

4

7 回答 7

47

除了Jatin的回答:

Spring 使用 Jakarta Commons Logging 作为日志 API。为了登录到 slf4j,您需要确保commons-logging不在类路径上。jcl-over-slf4j是公共日志记录的替换 jar。

如果您使用的是 maven,则可以检测 commons-logging 的使用来源,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>
于 2010-08-16T09:18:33.307 回答
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>
于 2010-08-02T12:04:38.887 回答
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>

但是不要忘记禁用从 Springcommons-logging依赖项中产生的依赖项,就像在接受的(Stijn 的)答案中一样。

于 2012-11-17T18:12:06.087 回答
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> 

有关更多信息,请在此处查看

于 2012-01-29T02:01:35.240 回答
1

将 log4j 文件保存在默认包中

于 2010-08-02T12:21:40.177 回答
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,所以不需要放那么多依赖

于 2012-12-31T03:22:28.630 回答
0

只需添加lazy-init="false"以在您的根上下文中急切地加载用于 log4j 配置的 bean。那应该解决警告消息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

于 2015-10-09T14:34:49.840 回答