避免日志充满 java.io.IOException: Broken pipe

Posted

技术标签:

【中文标题】避免日志充满 java.io.IOException: Broken pipe【英文标题】:Avoid logs full of java.io.IOException: Broken pipe 【发布时间】:2018-07-11 21:05:13 【问题描述】:

我在一个浏览器上使用 Server-Sent 事件,并在后端使用 Spring Boot 应用程序。当我击落客户端时,我得到了下一个异常:

14:35:09.458 [http-nio-8084-exec-25] ERROR o.a.c.c.C.[Tomcat].[localhost] - Exception Processing ErrorPage[errorCode=0, location=/error]
org.apache.catalina.connector.ClientAbortException: java.io.IOException: Broken pipe

我了解这是预期的行为;另一方面,我的应用程序运行良好,但我的日志中充满了这些异常。我猜这是由Tomcat引起的。有没有办法捕获这些异常,或者至少可以防止 Tomcat 将此异常堆栈跟踪写入日志?我的意思是,不修改Tomcat的代码。

【问题讨论】:

您的日志记录是如何配置的? 这有关系吗?我希望记录除此异常之外的所有内容。感谢您的关注:) 当然是相关的。你有一个关于日志的问题,你甚至不会告诉你你的日志是如何配置的?您正在使用哪个日志记录框架?你在哪里看到上面记录的行,catalina.out 正如我所说,我希望记录每个异常,但无论它们来自何处。日志框架:SLF4J 【参考方案1】:

为了防止日志中出现这种异常,您可以尝试对在客户端执行推送的代码进行一些更改。这是我的例子。我听 api 调用,然后它调用我将套接字推送到客户端。我想你可以看懂代码:

 @GetMapping("/api/status/groupId/groupstatusId")
@ResponseStatus(HttpStatus.NO_CONTENT)
@ExceptionHandler(IOException.class)
public void listenToNewStatus(@PathVariable Long groupId, @PathVariable String groupstatusId, IOException e) 
    Group group = groupDTOService.findById(groupId);
    if (group != null) 
        if (StringUtils.containsIgnoreCase(ExceptionUtils.getRootCauseMessage(e), "Broken pipe")) 
            logger.info("broken pipe");
         else 
            template.convertAndSend("/topic/callstatus/" + group.getUser().getId(), groupstatusId);
        

    

在这段代码中,为了防止管道损坏,我添加了注释 @ExceptionHandler(IOException.class) 并检查异常是否包含损坏的管道,然后没有其他任何东西向客户端发送消息。

【讨论】:

以上是关于避免日志充满 java.io.IOException: Broken pipe的主要内容,如果未能解决你的问题,请参考以下文章

ServletDownload

java读写properties文件

java中怎么实现ftp文件传输

腐败的表格数据:过早结束

在idea中mybatis错误

Android android.view.InflateException Binary XML 文件第 16 行:膨胀类片段时出错