【发布时间】: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