0

在我制作了 Spring Boot 反应式 Web 应用程序以支持 SSL 后,当我尝试对服务器进行 http 调用时,它会在控制台中的异常跟踪下方打印。作为应用程序所有者,我无法阻止任何人使用我的服务。但是我应该能够防止在控制台中进行跟踪打印,尤其是在IO 操作成本高昂的反应式 Web 应用程序中。有什么想法可以防止这种情况吗?

编辑 3

2018-10-01 14:11:18.440 ERROR 12457 --- [ctor-http-nio-2] r.i.n.channel.CloseableContextHandler    : Handler failure while no child channelOperation was present

编辑 2

IO 操作成本高昂的地方我刚刚意识到这可能发生在事件循环线程池之外。所以它可能不会阻塞任何线程。但我仍然喜欢防止它在控制台中打印。

编辑1

重现步骤

  • 签出项目https://github.com/sp13ceg/spring-boot-reative-ssl
  • 启动服务器 ./gradlew booRun
  • 使不安全的 https 调用curl --insecure https://localhost:8080/hi正常工作
  • 进行 http 调用curl http://localhost:8080/hi,您将在控制台中看到异常。

    io.netty.handler.ssl.NotSslRecordException: not an SSL/TLS record: 474554202f686920485454502f312e310d0a486f73743a206c6f63616c686f73743a383434340d0a557365722d4167656e743a206375726c2f372e35342e300d0a4163636570743a202a2f2a0d0a0d0a at io.netty.handler.ssl.SslHandler.decodeJdkCompatible(SslHandler.java:1178) [netty-handler-4.1.29.Final.jar: 4.1.29.Final] 在 io.netty.handler.ssl.SslHandler.decode(SslHandler.java:1243) [netty-handler-4.1.29.Final.jar:4.1.29.Final] 在 io.netty.handler .codec.ByteToMessageDecoder.decodeRemovalReentryProtection(ByteToMessageDecoder.java:489) [netty-codec-4.1.29.Final.jar:4.1.29.Final] 在 io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:428 ) [netty-codec-4.1.29.Final.jar:4.1.29.Final] 在 io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:265) [netty-codec-4.1.29.Final.jar:4.1.29.Final] 在 io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362) [netty-transport-4.1.29.Final.jar:4.1.29.Final] 在 io.netty .channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348) [netty-transport-4.1.29.Final.jar:4.1.29.Final] 在 io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:340) [ netty-transport-4.1.29.Final.jar:4.1.29.Final] 在 io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1434) [netty-transport-4.1.29.Final.jar: 4.1.29.Final] 在 io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362) [netty-transport-4.1.29.Final.jar:4.1.29.Final] 在 io.netty.channel.AbstractChannelHandlerContext .invokeChannelRead(AbstractChannelHandlerContext.java:348) [netty-transport-4.1.29.Final.jar:4.1.29.Final] 在 io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:965) [netty-transport-4.1 .29.Final.jar:4.1.29.Final] 在 io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:163) [netty-transport-4.1.29.Final.jar:4.1.29 .Final] 在 io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:628) [netty-transport-4.1.29.Final.jar:4.1.29.Final] 在 io.netty.channel.nio。 NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:563) [netty-transport-4.1.29.Final.jar:4.1.29.Final] 在 io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:480) [netty -transport-4.1.29.Final.jar:4.1.29.Final] 在 io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:442) [netty-transport-4.1.29.Final.jar:4.1.29.Final] 在 io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:884) [netty-common-4.1.29. Final.jar:4.1.29.Final] 在 java.lang.Thread.run(Thread.java:748)

4

1 回答 1

0

我只是错过了日志跟踪中的一件重要事情。在原始堆栈跟踪之前有一行显示它来自哪里的日志的名称。见编辑 3

添加此属性会禁用此日志在控制台中打印。 logging.level.reactor.ipc.netty.channel.CloseableContextHandler=off

于 2018-10-01T19:14:32.993 回答