Spring引导:如何记录httpStatus 500错误

Spring引导:如何记录httpStatus 500错误,spring,spring-boot,Spring,Spring Boot,我创建了一个AppErrorController,它扩展了Boot的ErrorController以处理status500错误。例如: @Controller public class AppErrorController implements ErrorController { private static final Logger LOGGER = LogManager.getLogger(AppErrorController.class); private static f

我创建了一个AppErrorController,它扩展了Boot的ErrorController以处理status500错误。例如:

@Controller
public class AppErrorController implements ErrorController {
    private static final Logger LOGGER = LogManager.getLogger(AppErrorController.class);
    private static final String ERROR = "error";
    private static final String ERROR_MESSAGE = "errorMessage";

    @RequestMapping(value = "/error")
    public String error(Exception e, Model model) {
        LOGGER.error("500", e);
        model.addAttribute(ERROR_MESSAGE, "Internal server error");
        return ERROR;
    }

    @Override
    public String getErrorPath() {
        return ERROR;
    }
}
我需要记录错误。但问题是异常e总是空的。如何提取实际错误以记录它


增加

我有一个GlobalExceptionHandler,但它从不捕捉'500'错误

@Component
@ControllerAdvice
public class GlobalExceptionHandler {
    private static final Logger LOGGER = LogManager.getLogger(GlobalExceptionHandler.class);
    private static final String ERROR = "error";

    @ExceptionHandler(Exception.class)
    public String handleException(Exception e) {
        LOGGER.error(e);
        return ERROR;
    }
}

从jsp层捕获异常的一种方法是定义自己的
错误页面
,并将其指向控制器。然后你就可以找出真正的原因,然后你想怎么做就怎么做

web.xml


从jsp层捕获异常的一种方法是定义自己的
错误页面
,并将其指向控制器。然后你就可以找出真正的原因,然后你想怎么做就怎么做

web.xml


您作为控制器而不是通过
@ExceptionHandler
实现此功能是否有特定的原因?是的,这是有原因的-它永远不起作用(请参阅上面的添加内容)您是否获得了500错误的白色页面?为什么要将
@Component
@ControllerAdvice
一起使用。仅使用
@ControllerAdvice
jmw5598,no AppErrorController提供自定义错误页(返回错误;),我现在不关心在浏览器屏幕中得到什么,但如何在服务器端记录此错误是否有特殊原因,您将此作为控制器而不是通过
@ExceptionHandler
实现?是,这是有原因的-它从来都不起作用(请参见上面的添加内容)您是否得到了500错误的白色页面?为什么要将
@Component
@ControllerAdvice
一起使用。仅使用
@ControllerAdvice
jmw5598,无AppErrorController提供自定义错误页(返回错误;),我现在不关心在浏览器屏幕中得到什么,但如何在服务器端记录此错误谢谢。但我必须另外实现Boot的ErrorController,才能使您的解决方案正常工作。谢谢。但我必须另外实现Boot的ErrorController,才能使您的解决方案正常工作。
<error-page>
    <exception-type>java.lang.Throwable</exception-type>
    <location>/error</location>
</error-page>
@Controller
@RequestMapping("/error")
public class ErrorController {

    private final Logger log = LoggerFactory.getLogger(ErrorController.class);

    @RequestMapping
    public String ex(HttpServletRequest request) {
        Throwable throwable = (Throwable) request.getAttribute("javax.servlet.error.exception");
        throwable.printStackTrace(); //print
        log.error(throwable.getMessage(), throwable); // or log
        // or save to db
        return "error"; //and redirect to some user-friendly page
    }
}