log4j的内存 "列表附加器"。

问题描述 投票:7回答:3

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

java log4j in-memory appender
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();
}

1
投票

我不相信有。不过你可以很容易的写出自己的。这里有一个 适当的教程.


0
投票

这是一个记录器appender的例子,它将所有的事件存储在内存中(在一个叫 "记录器 "的地方)。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 是使用 Logger 以记录您要捕捉的事件)。)

InMemoryLoggerAppender appender = new InMemoryLoggerAppender();
Logger log = Logger.getLogger(MyClass.class);
log.addAppender(appender);
© www.soinside.com 2019 - 2024. All rights reserved.