是否有 log4j 的 appender 只存储日志事件列表(用于单元测试,以验证没有写入错误日志)?
问问题
7080 次
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 回答