How do I configure Spring and SLF4J so that I can

2019-01-16 11:18发布

I've got a maven & spring app that I want logging in. I'm keen to use SLF4J.

I want to put all my config files into a directory {classpath}/config including log4j.xml and then init using a 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>

However I get this warning and no logging.

log4j:WARN No appenders could be found for logger (org.springframework.context.support.ClassPathXmlApplicationContext). log4j:WARN Please initialize the log4j system properly. log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.

I've googled around and can't find a simple example on setting this up. Any ideas?

7条回答
冷血范
2楼-- · 2019-01-16 11:33

Just for the sake of completeness, a logback-classic variant:

<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>

Do not forget however to disable commons-logging dependency which sprouts from Spring dependency like in the accepted (Stijn's) answer.

查看更多
你好瞎i
3楼-- · 2019-01-16 11:34

Use blow configuration for implementation of the JCL API on the 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> 

for More information check here

查看更多
家丑人穷心不美
4楼-- · 2019-01-16 11:40

You'll find an example at https://github.com/mbogoevici/spring-samples/tree/master/mvc-basic/trunk. You need to include some dependencies in your POM file to enable 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>
查看更多
【Aperson】
5楼-- · 2019-01-16 11:41

Just add lazy-init="false" to eagerly load the bean for log4j configuration in your root context. That should solve the WARN message log4j:WARN No appenders could be found for logger

Example:

<bean id="log4jInitialization" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean" lazy-init="false">

A more better approach would be to have the configuration in web.xml or as a JVM parameter (-Dlog4j.configuration=.../conf/log4j.xml or with 'file:' prefix as -Dlog4j.configuration=file:conf/log4j.properties for some cases)

查看更多
虎瘦雄心在
6楼-- · 2019-01-16 11:45

keep log4j file in default package

查看更多
SAY GOODBYE
7楼-- · 2019-01-16 11:55

I like the logback way, and for slf4j, we do the similar config:

    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>jcl-over-slf4j</artifactId>
    </dependency>

slf4j-log4j12 will automatically introduce slf4j-api and log4j, so don't need to put so many dependencies

查看更多
登录 后发表回答