【发布时间】:2021-04-11 18:57:32
【问题描述】:
我找到了一些关于 Logback 日志记录附加程序的编程配置的示例(甚至在 Stack Overflow 上),但是到目前为止,我已将其合并到自己的设置中并没有为我工作。一些示例产生了一个实际的Logger 实例,但考虑到我已经在我的类中静态实例化了一个Logger,我希望能够以编程方式启用我为单元测试目的而定义的Appender。
这是我的自定义附加程序:
package org.example.logging;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.AppenderBase;
import java.util.ArrayList;
import java.util.List;
// Credit to https://stackoverflow.com/a/29077499/5476186
public class TestAppender extends AppenderBase<ILoggingEvent> {
private static List<ILoggingEvent> events = new ArrayList<>();
@Override
protected void append(ILoggingEvent e) {
events.add(e);
}
public static List<ILoggingEvent> events() {
return List.copyOf(events);
}
public static void clear() {
events.clear();
}
}
在我的测试代码中,我正在尝试将我的TestAppender 配置为“启动”,以便在我的测试设置中调用此方法后,我可以捕获日志并验证它们:
package org.example.logging;
import ch.qos.logback.classic.LoggerContext;
import org.slf4j.LoggerFactory;
// ...
// Mostly modeled after https://stackoverflow.com/a/7825548/5476186
private static void startAppender() {
LoggerContext logCtx = (LoggerContext) LoggerFactory.getILoggerFactory();
TestAppender appender = new TestAppender();
appender.setContext(logCtx);
appender.setName("TEST");
// I was hoping this would statically allow the appender to kick in,
// but all of the examples then attach this appender to a Logger instance.
appender.start();
}
显然,这对我不起作用。所以我想我有两个偶然的问题。
- 这可能吗?如果可以,我怎样才能让它发挥作用?
- 如果这不可能,那么完成我想要做的最干净的方法是什么? (在测试期间启用/禁用附加程序,而不必手动弄乱配置文件。)
在上面链接的一个线程中,我发现这个看起来像one possible solution 的答案是修改配置文件中的文本并强制重新加载,但这对我来说似乎不是很干净。另一种选择是创建我自己的包装器Logger 工厂,我可以在测试执行期间使用依赖注入为记录器提供我的TestAppender。无论如何,我可能会创建一个包装器,即使我使用的是 SLF4J。
旁注:我知道我目前编写的测试代码与 Logback 而不是 SLF4J 紧密耦合,因此我也愿意接受有关该问题的批评/建议。
【问题讨论】:
标签: java junit logback slf4j junit5