gpt4 book ai didi

java - 使用 slf4j 和 log4j2 动态添加 appender

转载 作者:太空狗 更新时间:2023-10-29 22:56:18 26 4
gpt4 key购买 nike

我想动态创建一个 appender 并将其添加到记录器中。但是,对于 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));
}

}

我该怎么做才能让它发挥作用?也许我是从错误的角度来处理这个问题的,但我想避免创建自己的记录器类。非常感谢任何帮助。

最佳答案

我认为您遇到的情况与我们类似。生产中的日志记录更复杂,但 JUnit 测试期间的日志记录更简单,因此我们可以断言没有错误。

如果您使用的是 log4j2 > 2.4(但不支持 Java6),则有使用构建器的更清洁的解决方案,但这是我使用 log4j2 2.3 的解决方案:

@Test
public void testClass() {
LoggerContext loggerContext = (LoggerContext) LogManager.getContext(false);

Configuration configuration = loggerContext.getConfiguration();
LoggerConfig rootLoggerConfig = configuration.getLoggerConfig("");
ListAppender listAppender = new ListAppender("testAppender");

rootLoggerConfig.addAppender(listAppender, Level.ALL, null);

new TestClass(); //this is doing writing an error like org.slf4j.LoggerFactory.getLogger(TestClass.class).error("testing this");

assertEquals(1, listAppender.getEvents().size());
}

重要的是要注意,我们需要在调用 getContext 时传递“false”,否则它似乎无法获得与 slf4j 相同的上下文。

关于java - 使用 slf4j 和 log4j2 动态添加 appender,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22866275/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com