Our application structure:
app ear ->
-- jcl-over-slf4j-1.5.8.jar
-- log4j-1.2.16.jar
-- sl4fj-api-1.5.8.jar
-- sl4fj-log4j12-1.5.8.jar
-- spring-batch-core-2.1.6.RELEASE.jar
-- spring-batch-infrastructure-2.1.6.RELEASE.jar
-- spring-beans-3.0.5.RELEASE.jar
-- spring-core-3.0.5.RELEASE.jar
-- ....
-- foo-bar-module.jar
-- -- classes
-- -- -- org.foo.bar.job
-- -- -- -- FoobarWriter
-- -- -- -- FoobarWriteListener
External to the ear is a conf folder, which location is specified on the classpath, where the log4j.properties are:
Code:
log4j.rootCategory=INFO, GENERIC
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.Threshold=FATAL
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d{dd/MM/yyyy HH:mm:ss,SSS} [%t] %-5p %c %x - %m%n
...
log4j.appender.GENERIC=org.apache.log4j.RollingFileAppender
log4j.appender.GENERIC.File=C:/FoobarFiles/log/Generic.log
log4j.appender.GENERIC.Append=true
log4j.appender.GENERIC.Threshold=DEBUG
log4j.appender.GENERIC.layout=org.apache.log4j.PatternLayout
log4j.appender.GENERIC.layout.ConversionPattern=%d{dd/MM/yyyy HH:mm:ss,SSS} [%t] %-5p %c %x - %m%n
...
log4j.logger.org.foo.bar=WARN, GENERIC
log4j.logger.org.foo.bar.job=INFO, GENERIC
log4j.additivity.org.foo.bar.job=false
Deployment server is for this environment WebSphere 7.0.
Log statement code examples:
Code:
package org.foo.bar.job;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.batch.item.ItemWriter;
import java.util.List;
public class FoobarWriter implements ItemWriter<Integer> {
private final Log log = LogFactory.getLog(getClass());
public void write(List<? extends Integer> items ) throws Exception {
if(log.isInfoEnabled()) log.info("Writer Blah is blah blah");
}
}
Code:
package org.foo.bar.job;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.batch.core.StepListener;
import org.springframework.batch.core.annotation.BeforeStep;
import org.springframework.batch.core.StepExecution;
public class FoobarWriteListener implements StepListener {
private final Log log = LogFactory.getLog(getClass());
@BeforeStep
public void beforeStep(StepExecution stepExecution){
if(log.isInfoEnabled()) log.info("Listener Blah is blah blah");
}
}
Obviously example above is anonymised and simplified but that is a good equivalent of our code.
But only the listeners log statements are put into C:/FoobarFiles/log/Generic.log
Code:
23/03/2011 14:44:03,015 [WorkManager.FoobarWorkManager : 0] INFO org.foo.bar.job.FoobarWriteListener - Listener Blah is blah blah
while the writers log statements only end up in C:\Program Files(x86)\IBM\Websphere\AppServer\profiles\AppSrv 01\logs\FooBarServer\SystemOut.log
Code:
[3/23/11 16:31:02:109 IST] 00000024 FoobarWriter I org.foo.bar.job.FoobarWriter Writer Blah is blah blah
My only thought is that listeners and writers are separated by proxy objects or similar that breaks log4j configuration?