使用 mysql 和 spring 引导关闭 ssl 连接时的静音异常

Silence Exceptions on closing ssl connection with mysql and spring boot

我有 (spring 引导) 集成测试,该测试将测试容器用于 (mysql) 数据库。当测试结束时(即使它们成功了),我得到一个 ssl 异常(见下文)。我环顾四周,似乎这是 mysql 驱动程序的错误。我想将它们静音,以便万一出现任何故障,我可以轻松地从日志中确定(而现在,我的大部分日志都来自这个误导性异常)有谁知道如何使这些日志静音(我不知道不想使用 ssl)。日志打印如下,供大家参考:

2019-12-15 12:50:52.588  INFO 16171 --- [       Thread-3] o.s.s.concurrent.ThreadPoolTaskExecutor  : Shutting down ExecutorService 'applicationTaskExecutor'
2019-12-15 12:50:52.588  INFO 16171 --- [       Thread-3] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Shutdown initiated...
Sun Dec 15 12:50:52 EST 2019 WARN: Caught while disconnecting...

EXCEPTION STACK TRACE:



** BEGIN NESTED EXCEPTION ** 

javax.net.ssl.SSLException
MESSAGE: closing inbound before receiving peer's close_notify

STACKTRACE:

javax.net.ssl.SSLException: closing inbound before receiving peer's close_notify
at java.base/sun.security.ssl.Alert.createSSLException(Alert.java:133)
at java.base/sun.security.ssl.Alert.createSSLException(Alert.java:117)
at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:307)
at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:263)
at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:254)
at java.base/sun.security.ssl.SSLSocketImpl.shutdownInput(SSLSocketImpl.java:645)
at java.base/sun.security.ssl.SSLSocketImpl.shutdownInput(SSLSocketImpl.java:624)
at com.mysql.cj.protocol.a.NativeProtocol.quit(NativeProtocol.java:1319)
at com.mysql.cj.NativeSession.quit(NativeSession.java:182)
at com.mysql.cj.jdbc.ConnectionImpl.realClose(ConnectionImpl.java:1750)
at com.mysql.cj.jdbc.ConnectionImpl.close(ConnectionImpl.java:720)
at com.zaxxer.hikari.pool.PoolBase.quietlyCloseConnection(PoolBase.java:135)
at com.zaxxer.hikari.pool.HikariPool.lambda$closeConnection(HikariPool.java:441)
at        java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
at     java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
at java.base/java.lang.Thread.run(Thread.java:834)


** END NESTED EXCEPTION **


Sun Dec 15 12:50:52 EST 2019 WARN: Caught while disconnecting...

EXCEPTION STACK TRACE:



** BEGIN NESTED EXCEPTION ** 

javax.net.ssl.SSLException
MESSAGE: closing inbound before receiving peer's close_notify
...
rest ommitted for brevity

谢谢

嗯,你只需要添加

logging.level.<package_name>=ERROR

到您的 spring 配置属性 我会先尝试

logging.level.javax.net.ssl=ERROR

但如果它不起作用,请尝试使用不同的软件包。我在日志中看到的问题是它看起来不是通过标准日志记录机制而是通过 stderr 完成的。如果是这种情况并且属性方法不起作用 - 那么您需要为 stderr 指定自己的 PrintStream。这可以用

来完成
System.setErr(new PrintStream(new OutputStream() {
            @Override
            public void write(int i) throws IOException {
                //ignore
            }
        }));