【问题标题】:HTTP Statuscode 500 in Tomcat AccesLog on ClientAbortException / BrokenPipeClientAbortException / Broken Pipe 上的 Tomcat 访问日志中的 HTTP 状态代码 500
【发布时间】:2017-08-21 21:45:24
【问题描述】:

我们使用 Kibana 设置了一些仪表板和可视化,以监控由 tomcat 为我们的 Spring Boot Web 应用程序生成的 accessLogs。

我们特别关注已用 Statuscode 5xx 回答的请求。

事实证明,如果客户端请求资源并且在请求进行时取消请求(带有ClientAbortException/BrokenPipe 错误),则 ResponseCode 设置为 500,并且应用程序日志中不会记录任何错误(即没关系)。

我们现在想要将 ResponseCode 更改为不同于 500 的值,以便更好地区分“真正的”内部服务器错误和“预期的连接中止,由客户端发起”。

为此我实现了一个 ExceptionHandler 如下:

@RestControllerAdvice
public class HttpRequestExceptionHandler {

  private final static Logger LOGGER = LoggerFactory.getLogger(HttpRequestExceptionHandler.class);

  @ExceptionHandler(value = { ClientAbortException.class })
  @ResponseBody
  public ResponseEntity<String> exceptionHandler(Exception e, HttpServletResponse res) {
    res.setStatus(299);
    //res.sendError(299);
    LOGGER.error(""+res.getStatus());
    return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(null);
  }
}

事实证明,statusCode 500 是由 tomcat/catalina/coyote 内部设置的,不能从外部更改(因为响应设置为已提交)。

是否有可能以某种方式区分“真正的”内部服务器错误和“只是”连接中止?

【问题讨论】:

    标签: tomcat spring-boot access-log


    【解决方案1】:

    事实证明,这似乎是不久前引入的,Tomcat

    8.5.12 起
    8.0.42 起
    7.0.76 起

    并且计划将其恢复为记录应用程序设置的状态码,而不是 500:see discussion here

    另一种解决方法可能是将%{javax.servlet.error.exception}r 添加到访问日志模式server.tomcat.accesslog.pattern= 中,这将注销类似...

    ... org.apache.catalina.connector.ClientAbortException: java.io.IOException: Eine bestehende Verbindung wurde ...

    并通过 ELK 过滤掉这些条目。

    【讨论】:

      猜你喜欢
      • 2016-02-28
      • 2012-08-09
      • 2018-07-11
      • 1970-01-01
      • 2013-06-29
      • 2014-11-10
      • 2023-02-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多