You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Quarkus中使用自定义日志Appender?

在Quarkus中实现自定义日志Handler(替代Appender)用于测试环境

Quarkus底层采用JBoss LogManager(基于Java Util Logging规范),不需要用Logback或Log4j2的Appender概念,而是要实现JUL Handler来满足你的需求,完全不需要额外添加Log4j/Logback依赖,符合官方文档要求。

1. 实现自定义Handler

创建一个继承org.jboss.logmanager.ExtHandler的类(比原生java.util.logging.Handler更易用),实现日志收集逻辑:

import org.jboss.logmanager.ExtHandler;
import org.jboss.logmanager.ExtLogRecord;
import java.util.ArrayList;
import java.util.List;

public class TestLogHandler extends ExtHandler {
    private final List<ExtLogRecord> collectedLogs = new ArrayList<>();

    @Override
    protected void doPublish(ExtLogRecord record) {
        collectedLogs.add(record);
        // 如需传递日志给其他Handler,可调用super.doPublish(record);
    }

    // 测试时获取收集到的日志
    public List<ExtLogRecord> getCollectedLogs() {
        return new ArrayList<>(collectedLogs);
    }

    // 清空日志,方便测试复用
    public void clearLogs() {
        collectedLogs.clear();
    }
}

2. 在测试环境中注册Handler

在测试类中通过编程方式,将自定义Handler添加到根Logger或指定Logger中,确保测试时生效:

import io.quarkus.test.junit.QuarkusTest;
import org.jboss.logmanager.LogContext;
import org.jboss.logmanager.Logger;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;

@QuarkusTest
public class LoggingTest {
    private static TestLogHandler testLogHandler;
    private static Logger rootLogger;

    @BeforeAll
    static void setupLogging() {
        rootLogger = LogContext.getLogContext().getLogger("");
        testLogHandler = new TestLogHandler();
        // 设置日志级别,按需调整
        testLogHandler.setLevel(java.util.logging.Level.ALL);
        rootLogger.addHandler(testLogHandler);
    }

    @AfterAll
    static void cleanupLogging() {
        // 测试结束移除Handler,避免影响其他测试
        if (rootLogger != null && testLogHandler != null) {
            rootLogger.removeHandler(testLogHandler);
        }
    }

    @Test
    void testLogMessageCollection() {
        // 触发日志输出
        Logger logger = LogContext.getLogContext().getLogger(LoggingTest.class.getName());
        logger.info("Test log message");

        // 验证日志是否被收集
        var logs = testLogHandler.getCollectedLogs();
        assertEquals(1, logs.size());
        assertEquals("Test log message", logs.get(0).getMessage());
    }
}

3. 注意事项

  • 若只需收集特定Logger的日志,只需将Handler添加到对应Logger而非根Logger
  • 无需额外引入任何Log4j/Logback依赖,Quarkus自带的JBoss LogManager已包含所有所需类
  • 测试后记得移除Handler,避免不同测试用例间的日志污染

内容的提问来源于stack exchange,提问作者ss1

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 05:33:27