views:

285

answers:

3

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?

+1  A: 

You'll find an example at https://src.springframework.org/svn/spring-samples/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>
Jatin
The example has the log4j config file directly in the classpath, not under a config directory which is what I'd like.
Peter Wilkinson
Actually that did help a bit though. I've now got logging in my app, It's just spring that's complaining.
Peter Wilkinson
If a particular class is complaining you need to add the required package to the list of packaged registered with the logger. You can also put it in a config folder and add that folder to the class path.
Jatin
I think the warning is start up only. Once the log4j configurer bean has run I'm getting all the logging I need.Would be nice to be able to make the warning go away, but I think I'm ok to leave it.
Peter Wilkinson
A: 

keep log4j file in default package

taher
A: 

In addition to Jatin's answer:

Spring uses Jakarta Commons Logging as a logging API. In order to log to slf4j, you need to make sure commons-logging is not on the classpath. jcl-over-slf4j is a replacement jar for commons-logging.

If you're using maven, you can detect where commons-logging comes from using mvn dependency:tree and exclude it from all dependencies that require it using dependency exclusions. You might need to run mvn dependency:tree several times though, because it only shows the first occurence of a transitive dependency.

<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>
Stijn Van Bael