使用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
相关产品推荐
相关产品推荐

