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

使用ConsoleCaptor.getStandardOutput()在@QuarkusTest中无法捕获日志

问题解决:QuarkusTest下LogCaptor/ConsoleCaptor无法捕获日志

核心原因

你使用的ConsoleCaptor是捕获System.out/System.err输出的,但Quarkus默认基于JBoss Logging实现日志功能,日志是通过日志框架输出而非直接写入System.out,因此ConsoleCaptor无法获取到内容。另外@QuarkusTest会提前启动完整的Quarkus应用上下文,日志初始化早于你在测试方法内创建的捕获器,导致错过日志输出时机。

解决方案

1. 改用LogCaptor捕获日志(适配JBoss Logging)

LogCaptor原生支持捕获JBoss Logging的日志输出,直接针对日志框架而非控制台流,更适配Quarkus场景。

调整后的测试代码:

@QuarkusTest
public class TestLog {

  ObjectMapper mapper = new ObjectMapper();
  // 提前初始化LogCaptor,覆盖应用启动到测试全程的日志
  private final LogCaptor logCaptor = LogCaptor.forRoot();

  @Test
  public void testLogIsInJsonFormat() {
    QueryClass query = new QueryClass();
    query.querySomeItem(null, null);
    
    // 获取捕获到的所有日志内容
    List<String> logs = logCaptor.getLogs();
    
    // 验证日志存在且格式合法
    assertFalse(logs.isEmpty());
    assertTrue(isValid(logs.get(1)));
  }

  // JSON格式校验方法
  private boolean isValid(String log) {
    try {
      mapper.readTree(log);
      return true;
    } catch (JsonProcessingException e) {
      return false;
    }
  }
}

2. 捕获特定Logger的日志(可选)

如果只关注某个类/包的日志,可以指定Logger名称:

// 替换为你需要监控的Logger全名
private final LogCaptor logCaptor = LogCaptor.forLogger("io.quarkus.amazon.lambda.runtime.AbstractLambdaPollLoop");

3. 调整测试环境日志配置(可选)

确保测试环境日志级别及格式配置正确,在src/test/resources/application.properties中添加:

quarkus.log.level=INFO
# 若使用JSON格式日志,需开启对应配置
quarkus.log.console.json=true

4. 清理冗余依赖

既然改用LogCaptor,可移除consolecaptor依赖,避免不必要的冲突。

关键注意点

  • @QuarkusTest启动应用上下文的时机早于测试方法,因此LogCaptor需在测试类初始化时创建,而非方法内部,才能完整捕获应用启动及测试过程的日志。
  • 针对日志框架的捕获场景,优先使用LogCaptor而非ConsoleCaptor,前者可靠性更高。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 22:54:16