【问题标题】:Static Context Configuration for Logback AppendersLogback Appender 的静态上下文配置
【发布时间】: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();
    }

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

  1. 这可能吗?如果可以,我怎样才能让它发挥作用?
  2. 如果这不可能,那么完成我想要做的最干净的方法是什么? (在测试期间启用/禁用附加程序,而不必手动弄乱配置文件。)

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

旁注:我知道我目前编写的测试代码与 Logback 而不是 SLF4J 紧密耦合,因此我也愿意接受有关该问题的批评/建议。

【问题讨论】:

    标签: java junit logback slf4j junit5


    【解决方案1】:

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

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

    这样你:

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

    我提供的链接包含 API 示例以及 maven 集成示例。

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

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

    【讨论】:

    • 我将继续接受您的答案作为正确答案,因为您提供的最后一个链接让我意识到我严重误读了我遇到的许多测试代码。在您的链接中,这条线对我来说很突出:private Logger appLogger = (Logger) LoggerFactory.getLogger(App.class); 所以我没有意识到将我们的附加程序附加到“主”类的记录器会完全符合我的要求。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2014-07-31
    • 1970-01-01
    • 1970-01-01
    • 2015-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多