关闭与mysql和spring boot的ssl连接时的静音异常

Posted

技术标签:

【中文标题】关闭与mysql和spring boot的ssl连接时的静音异常【英文标题】:Silence Exceptions on closing ssl connection with mysql and spring boot 【发布时间】:2020-04-08 07:51:17 【问题描述】:

我有 (spring boot) 集成测试,它使用 (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$1(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

谢谢

【问题讨论】:

【参考方案1】:

好吧,你只需要添加

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
            
        ));

【讨论】:

谢谢@Alexey,你说得对,我可以覆盖标准错误输出(确保在课前输入,课后似乎是在输出已经打印之后)。谢谢

以上是关于关闭与mysql和spring boot的ssl连接时的静音异常的主要内容,如果未能解决你的问题,请参考以下文章

通过 SSL 的 Spring Boot 远程 Mysql 连接

Spring Boot 使用 SSL 连接到 Postgresql

无法使用 Spring Boot 连接到具有多个 SSL 证书的多个 IBM MQ 通道

如何配置 Spring Boot 应用程序以在 MySQL 上使用 SSL/TLS?

如何使用 CassandraAutoConfiguration 在 Spring Boot 应用程序和 cassandra 之间配置 ssl?

Spring Boot + MySQL + Docker Compose - 无法使 Spring Boot 连接到 MySQL