【发布时间】:2014-04-04 14:59:55
【问题描述】:
我想动态创建一个附加程序并将其添加到记录器。但是,对于 slf4j,这似乎是不可能的。我可以将 appender 添加到 log4j 记录器,但是我无法使用 slf4j LoggerFactoy 检索记录器。
我想要做什么:我创建一个测试类(不是 jUnit 测试)并在构造函数中传递一个记录器供测试类使用。测试类的每个实例都需要它自己的记录器和附加程序来保存日志,以便以后在 HTML 报告中使用。
我尝试了什么(为简单起见,我创建了一个 jUnit 测试):
import static org.junit.Assert.assertEquals;
import java.util.LinkedList;
import java.util.List;
import org.apache.logging.log4j.core.LogEvent;
import org.junit.Test;
import org.slf4j.helpers.Log4jLoggerFactory;
import ch.fides.fusion.logging.ListAppender;
public class ListAppenderTest {
@Test
public void test() {
String testName = "test1";
// the log messages are to be inserted in this list
List<LogEvent> testLog = new LinkedList<>();
// create log4j logger
org.apache.logging.log4j.core.Logger log4jlogger = (org.apache.logging.log4j.core.Logger) org.apache.logging.log4j.LogManager
.getLogger("Test:" + testName);
// create appender and add it to the logger
ListAppender listAppender = new ListAppender("Test:" + testName + ":MemoryAppender", testLog);
log4jlogger.addAppender(listAppender);
// get the slf4j logger
org.slf4j.helpers.Log4jLoggerFactory loggerFactory = new Log4jLoggerFactory();
org.slf4j.Logger testLogger = loggerFactory.getLogger("Test:" + testName);
// test it
final String TEST_MESSAGE = "test message";
testLogger.info(TEST_MESSAGE);
assertEquals(1, testLog.size());
LogEvent logEvent = testLog.get(0);
assertEquals(TEST_MESSAGE, logEvent.getMessage().getFormattedMessage() );
}
}
这是我非常基本的附加程序:
package ch.fides.fusion.logging;
import java.util.List;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.appender.AbstractAppender;
public class ListAppender extends AbstractAppender {
private final List<LogEvent> log;
public ListAppender(String name, List<LogEvent> testLog) {
super(name, null, null);
this.log = testLog;
}
@Override
public void append(LogEvent logEvent) {
log.add(new TestLogEvent(logEvent));
}
}
我该怎么做才能让它发挥作用?也许我从错误的角度来处理这个问题,但我想避免创建自己的记录器类。非常感谢任何帮助。
【问题讨论】:
-
嗨 Daniele,你让这个工作了吗?如果你这样做了,你会发布你的解决方案吗?干杯马克。
-
当时除了写一个实现Logger接口的自定义类,我没有别的想法。这不是我真正想要的,但它确实完成了工作。不幸的是,我现在正在做一个不同的项目,我没有时间在这里查看其他解决方案。