1. Configure log4j on package level
When you want the logs for different package to be in different log files, you can configure log4j in package level.
So Log4j can be configured on package level, name the logger using the package name, note that the loggers for child packages
would write to the log files of parent packages.
e.g.
<logger name="fred.test.log4j">
<level value="debug"/>
<appender-ref ref="MainProcessAppender"/>
</logger>
<logger name="fred.test.log4j.packageTwo">
<level value="debug"/>
<appender-ref ref="MonitorAppender"/>
</logger>
Say logger "fred.test.log4j" would write to main.log, logger "fred.test.log4j.packageTwo" would write to monitor.log.
then when you run this program, the second logger will write to main.log as well.
2. how to test log4j ?
1. create test appender which derives from AppenderSkeleton
2. get the same logger using "Logger.getLogger()"
3. add the test appender to the logger
4. call the target method which will get the same logger and write logs
5. get log from the appender and verify the log entries
## TargetClassTest.java
TargetClass target;
@Test
public static void test() {
final TestAppender appender = new TestAppender();
final Logger logger = Logger.getLogger(Log4jExampleOne.class);
logger.addAppender(appender);
try {
target.targetMethodWhichWriteLogs();
}
finally {
logger.removeAppender(appender);
}
final List<LoggingEvent> log = appender.getLog();
final LoggingEvent firstLogEntry = log.get(0);
Assert.isTrue(firstLogEntry.getLevel() == Level.INFO);
Assert.isTrue(firstLogEntry.getMessage().equals("Test"));
Assert.isTrue(firstLogEntry.getLoggerName().equals("fred.test.log4j.TargetClass"));
}
class TestAppender extends AppenderSkeleton {
private final List<LoggingEvent> log = new ArrayList<LoggingEvent>();
@Override
public boolean requiresLayout() {
return false;
}
@Override
protected void append(final LoggingEvent loggingEvent) {
log.add(loggingEvent);
}
@Override
public void close() {
}
public List<LoggingEvent> getLog() {
return new ArrayList<LoggingEvent>(log);
}
}
## TargetClass.java
## package name: fred.test.log4j
final Logger logger = Logger.getLogger(TargetClass.class);
public void targetMethodWhichWriteLogs(){
logger.info("Test");
}