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();
    }

显然,这对我不起作用。所以我想我有两个条件问题。

  1. 这可能吗?如果可以,我怎样才能让它发挥作用?
  2. 如果这不可能,那么完成我想要做的事情的最简洁的方法是什么? (Enable/disable appenders 在测试期间无需手动弄乱配置文件。)

在上面链接的其中一个线程中,我发现这个看起来像 one possible solution 的答案是修改配置文件中的文本并强制重新加载,但这对我来说似乎不太干净.另一种选择是创建我自己的包装器 Logger 工厂,我可以使用它在依赖注入的测试执行期间为记录器提供我的 TestAppender。无论如何,我可能会创建一个包装器,即使我使用的是 SLF4J。

旁注:我知道我目前编写的测试代码与 Logback 而不是 SLF4J 紧密耦合,所以我也对 criticism/advice 这个问题持开放态度。

如果您在生产代码中使用 slf4j,那么已经有一个项目可以帮助进行测试:名为 slf4j-test

简而言之,它提供了一个 API 来检索测试中的“测试记录器”,它将所有记录的消息保存在内存中,以便您能够验证它们。

这样你:

  1. 执行记录某些内容的方法
  2. 检索测试记录器
  3. 在测试记录器上调用 getLoggingEvents() 并验证记录的事件

我提供的 link 包含 API 的示例以及 Maven 集成示例。

如果,或者你想直接使用 logback 进行测试或其他东西,已经有一个 ListAppender 作为 logback 分发的一部分提供,它允许检索已经通过 appender 的事件。您可以通过编程方式将其添加到记录器并在测试中使用。

Here 你可以找到一个全面的例子