您的位置:首页 > 其它

Log4j on package level and how to test log entries produced by Log4j

2014-01-21 10:28 459 查看
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");

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: