代码之家  ›  专栏  ›  技术社区  ›  Programming Guy

如何配置spring和slf4j以获得日志记录?

  •  42
  • Programming Guy  · 技术社区  · 14 年前

    我有一个Maven&Spring应用程序要登录。我很想用SLF4J。

    我想将所有配置文件放在一个目录classpath/config中,包括log4j.xml,然后使用SpringBean初始化。

    例如

    <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:警告看 http://logging.apache.org/log4j/1.2/faq.html#noconfig 更多信息。

    我到处搜索,找不到一个简单的设置例子。有什么想法吗?

    7 回复  |  直到 7 年前
        1
  •  46
  •   Stijn Van Bael    14 年前

    除了Jatin的回答:

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

    如果您使用的是maven,那么您可以使用 mvn dependency:tree 并使用依赖项排除将其从所有需要它的依赖项中排除。你可能需要跑 MVN依赖项:树 但有几次,因为它只显示了第一次出现的可传递依赖。

    <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>
    
        2
  •  27
  •   Bhargav Rao rlgjr    7 年前

    您可以在 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>
    
        3
  •  6
  •   agilob    7 年前

    为了完整起见, 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 附属国 这源于春天的依附,就像在公认的(斯蒂恩的)答案中一样。

        4
  •  5
  •   Chandra Sekhar    13 年前

    使用吹气配置来实现 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

        5
  •  1
  •   TaherT    14 年前

    将log4j文件保留在默认包中

        6
  •  1
  •   Jianyu    12 年前

    我喜欢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,所以不需要放置太多的依赖项

        7
  •  0
  •   Nashvi    9 年前

    只要添加 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 在某些情况下)