我也需要几次。我在下面整理了一个小样本,你可以根据需要进行调整。基本上,你可以创建自己的
Appender并将其添加到所需的记录器中。如果你想收集所有内容,那么根记录器是一个很好的起点,但是如果你愿意,可以使用更具体的信息。完成后,请不要忘记删除Appender,否则可能会导致内存泄漏。下面,我在测试中完成了此操作,但根据你的需要,setUp或者
@Before和
/ tearDown或
@After可能是更好的地方。
同样,下面的实现将所有内容收集到一个List内存中。如果记录很多,你可能会考虑添加一个过滤器以删除无聊的条目,或将日志写入磁盘上的临时文件(提示:
LoggingEventis Serializable,因此,如果你的日志消息是,则应该能够序列化事件对象是。)
import org.apache.log4j.AppenderSkeleton;import org.apache.log4j.Level;import org.apache.log4j.Logger;import org.apache.log4j.spi.LoggingEvent;import org.junit.Test;import java.util.ArrayList;import java.util.List;import static org.hamcrest.CoreMatchers.is;import static org.junit.Assert.assertThat;public class MyTest { @Test public void test() { final TestAppender appender = new TestAppender(); final Logger logger = Logger.getRootLogger(); logger.addAppender(appender); try { Logger.getLogger(MyTest.class).info("Test"); } finally { logger.removeAppender(appender); } final List<LoggingEvent> log = appender.getLog(); final LoggingEvent firstLogEntry = log.get(0); assertThat(firstLogEntry.getLevel(), is(Level.INFO)); assertThat((String) firstLogEntry.getMessage(), is("Test")); assertThat(firstLogEntry.getLoggerName(), is("MyTest")); }}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); }}


