2017-08-21 38 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篩選出這些條目。

相關問題