Logback Appenders 的静态上下文配置
Static Context Configuration for Logback Appenders
我发现了一些 Logback 日志记录附加程序的一些编程配置的示例(甚至在 Stack Overflow 上),但到目前为止,我已经融入到我自己的设置中的所有内容对我来说都不起作用。一些示例生成了一个实际的 Logger
实例,但考虑到我已经在我的 class 中静态实例化了一个 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
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
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();
}
显然,这对我不起作用。所以我想我有两个条件问题。
- 这可能吗?如果可以,我怎样才能让它发挥作用?
- 如果这不可能,那么完成我想要做的事情的最简洁的方法是什么? (Enable/disable appenders 在测试期间无需手动弄乱配置文件。)
在上面链接的其中一个线程中,我发现这个看起来像 one possible solution 的答案是修改配置文件中的文本并强制重新加载,但这对我来说似乎不太干净.另一种选择是创建我自己的包装器 Logger
工厂,我可以使用它在依赖注入的测试执行期间为记录器提供我的 TestAppender
。无论如何,我可能会创建一个包装器,即使我使用的是 SLF4J。
旁注:我知道我目前编写的测试代码与 Logback 而不是 SLF4J 紧密耦合,所以我也对 criticism/advice 这个问题持开放态度。
如果您在生产代码中使用 slf4j,那么已经有一个项目可以帮助进行测试:名为 slf4j-test
简而言之,它提供了一个 API 来检索测试中的“测试记录器”,它将所有记录的消息保存在内存中,以便您能够验证它们。
这样你:
- 执行记录某些内容的方法
- 检索测试记录器
- 在测试记录器上调用
getLoggingEvents()
并验证记录的事件
我提供的 link 包含 API 的示例以及 Maven 集成示例。
如果,或者你想直接使用 logback 进行测试或其他东西,已经有一个 ListAppender
作为 logback 分发的一部分提供,它允许检索已经通过 appender 的事件。您可以通过编程方式将其添加到记录器并在测试中使用。
Here 你可以找到一个全面的例子
我发现了一些 Logback 日志记录附加程序的一些编程配置的示例(甚至在 Stack Overflow 上),但到目前为止,我已经融入到我自己的设置中的所有内容对我来说都不起作用。一些示例生成了一个实际的 Logger
实例,但考虑到我已经在我的 class 中静态实例化了一个 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
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
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();
}
显然,这对我不起作用。所以我想我有两个条件问题。
- 这可能吗?如果可以,我怎样才能让它发挥作用?
- 如果这不可能,那么完成我想要做的事情的最简洁的方法是什么? (Enable/disable appenders 在测试期间无需手动弄乱配置文件。)
在上面链接的其中一个线程中,我发现这个看起来像 one possible solution 的答案是修改配置文件中的文本并强制重新加载,但这对我来说似乎不太干净.另一种选择是创建我自己的包装器 Logger
工厂,我可以使用它在依赖注入的测试执行期间为记录器提供我的 TestAppender
。无论如何,我可能会创建一个包装器,即使我使用的是 SLF4J。
旁注:我知道我目前编写的测试代码与 Logback 而不是 SLF4J 紧密耦合,所以我也对 criticism/advice 这个问题持开放态度。
如果您在生产代码中使用 slf4j,那么已经有一个项目可以帮助进行测试:名为 slf4j-test
简而言之,它提供了一个 API 来检索测试中的“测试记录器”,它将所有记录的消息保存在内存中,以便您能够验证它们。
这样你:
- 执行记录某些内容的方法
- 检索测试记录器
- 在测试记录器上调用
getLoggingEvents()
并验证记录的事件
我提供的 link 包含 API 的示例以及 Maven 集成示例。
如果,或者你想直接使用 logback 进行测试或其他东西,已经有一个 ListAppender
作为 logback 分发的一部分提供,它允许检索已经通过 appender 的事件。您可以通过编程方式将其添加到记录器并在测试中使用。
Here 你可以找到一个全面的例子