Java EmbeddedDatabase(H2)日志配置咨询:如何减少连接创建日志并保留错误日志
解决EmbeddedDatabase连接创建日志泛滥的问题
针对你遇到的测试中每次创建连接都输出冗余日志的问题,这里有几个实用的解决方案,适配你Spring外普通单元测试的场景:
方案1:通过日志框架调整级别(推荐)
这条"Creating new JDBC Driver Connection to..."日志通常来自H2驱动本身或者Spring的EmbeddedDatabase相关组件,你可以通过日志配置把对应包的日志级别调到WARN或ERROR,只保留错误日志,关闭INFO级别的冗余输出。
如果用Java Util Logging(默认普通Java测试用这个)
在src/test/resources下新建logging.properties文件:
# 关闭H2驱动的INFO日志,只保留警告和错误 org.h2.level = WARN # 如果日志来自Spring的EmbeddedDatabase模块,也可以加上这个 org.springframework.jdbc.datasource.embedded.level = WARN
如果用Logback(需要先引入Logback依赖)
在src/test/resources下新建logback-test.xml文件:
<configuration> <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> </appender> <root level="INFO"> <appender-ref ref="CONSOLE" /> </root> <!-- 过滤H2的连接创建日志 --> <logger name="org.h2" level="WARN" /> <!-- 可选:过滤Spring EmbeddedDatabase的INFO日志 --> <logger name="org.springframework.jdbc.datasource.embedded" level="WARN" /> </configuration>
方案2:自定义PrintWriter过滤特定日志
你提到可以设置PrintWriter,那可以通过重写PrintWriter的输出方法,精准过滤掉那条冗余日志,同时保留错误信息:
// 自定义PrintWriter,过滤指定日志内容 PrintWriter filteredLogWriter = new PrintWriter(System.out) { @Override public void write(String s) { // 跳过连接创建的日志行,保留其他所有日志(包括错误日志) if (!s.contains("Creating new JDBC Driver Connection to")) { super.write(s); } } // 覆盖重载方法,确保所有输出都经过过滤 @Override public void write(char[] buf, int off, int len) { String logContent = new String(buf, off, len); if (!logContent.contains("Creating new JDBC Driver Connection to")) { super.write(buf, off, len); } } }; // 构建EmbeddedDatabase时设置自定义的PrintWriter EmbeddedDatabase embeddedDatabase = new EmbeddedDatabaseBuilder() .generateUniqueName(true) .setType(EmbeddedDatabaseType.H2) .setLogWriter(filteredLogWriter) .build();
方案3:改用连接池减少连接创建(同时提升测试性能)
既然你的测试每个请求都新建连接,不如用轻量连接池(比如HikariCP)复用连接,从根源上减少这类日志的产生,还能加快测试速度:
首先引入HikariCP依赖(Maven示例):
<dependency> <groupId>com.zaxxer</groupId> <artifactId>HikariCP</artifactId> <version>5.0.1</version> <scope>test</scope> </dependency>
然后修改代码使用连接池:
// 初始化Hikari连接池 HikariDataSource hikariDataSource = new HikariDataSource(); hikariDataSource.setJdbcUrl("jdbc:h2:mem:test;DB_CLOSE_DELAY=-1"); hikariDataSource.setUsername("sa"); hikariDataSource.setPassword(""); hikariDataSource.setMaximumPoolSize(3); // 测试环境设置小池即可 // 用连接池构建EmbeddedDatabase EmbeddedDatabase embeddedDatabase = new EmbeddedDatabaseBuilder() .generateUniqueName(true) .setDataSource(hikariDataSource) .build();
这样连接会被复用,不会每次创建新连接,日志自然就少了。
内容的提问来源于stack exchange,提问作者user18513066
相关产品推荐
相关产品推荐

