7

是否有 log4j 的 appender 只存储日志事件列表(用于单元测试,以验证没有写入错误日志)?

4

3 回答 3

3

有一个MemoryAppender,但它不是标准 log4j 库的一部分。

您可以轻松编写自己的代码,但如果您仅将它们用于单元测试,我可能会模拟 Logger 并断言没有对其进行调用。覆盖目标类中的 getLogger() 方法或直接在类型上设置模拟 Logger。

使用 Jmock(来自内存的示例,如有任何错误,请见谅):

public void testDoFoo() {
    Mockery mockery = new Mockery();
    Logger mockLogger = mockery.mock(Logger.class);

    Foo foo = new Foo();

    foo.setLogger(mockLogger);

    mockery.checking(new Expectations() {
        {
            never(mockLogger).debug(with(any(String.class));
        }
    };

    ...
    //do the actual test.

    //assert the mock type has never been called.
    mockery.assertIsSatisfied();
}
于 2009-07-19T11:58:31.590 回答
1

我不相信有。不过,您可以轻松编写自己的代码。这是一个合适的教程

于 2009-07-19T11:40:50.363 回答
0

这是 logger appender 的示例实现,它将所有事件存储在内存中(在 a 中StringBuilder);然后可以使用以下方式检索内容getResult

package apackage;

import org.apache.log4j.AppenderSkeleton;
import org.apache.log4j.spi.LoggingEvent;

/**
 * Records logging events in a String.
 * 
 * @author Lorenzo Bettini
 *
 */
public class InMemoryLoggerAppender extends AppenderSkeleton {

    private StringBuilder builder = new StringBuilder();

    @Override
    public void close() {
        // nothing to close
    }

    @Override
    public boolean requiresLayout() {
        return false;
    }

    @Override
    protected void append(LoggingEvent event) {
        builder.append(
            event.getLevel() + ": " + event.getMessage().toString()
            + System.lineSeparator());
    }

    public String getResult() {
        return builder.toString();
    }
}

然后,您必须将此附加程序添加到现有的Logger,例如(MyClass是使用 aLogger来记录您要捕获的事件的类):

InMemoryLoggerAppender appender = new InMemoryLoggerAppender();
Logger log = Logger.getLogger(MyClass.class);
log.addAppender(appender);
于 2020-05-22T12:52:45.777 回答