2017-08-21 29 views
1

我们使用Kibana设置了一些仪表板和可视化,以监视由tomcat为我们的spring引导web应用程序生成的accesslog。Tomcat中的HTTP状态代码500 ClientAbortException/BrokenPipe上的AccesLog

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

事实证明,如果客户端请求资源,并且请求正在进行中,取消请求(带有ClientAbortException/BrokenPipe错误),则ResponseCode设置为500,并且应用程序日志中不记录任何错误(这是种类好的)。

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

THEREFOR予实现的的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 /卡塔利娜/丛林狼内部设置,并且不能从外部改变(作为响应被设置承诺)。

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

回答

0

事实证明这似乎已经前不久介绍,随着Tomcat的

8.5.12起
8.0.42起
7.0.76起

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

另一个解决办法可能是添加%{javax.servlet.error.exception}r到ACCESSLOG模式server.tomcat.accesslog.pattern=这将注销像..

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

并通过ELK筛选出这些条目。

相关问题