防止在Spring Boot应用程序中针对自定义异常的堆栈跟踪日志记录

罗尔瓦特:

Spring Boot(mvc)中是否可以记录自定义异常并将其抛出,而其堆栈跟踪在日志文件中不可见但是对于其他任何异常,仍请参见堆栈跟踪。

详细说明:

我正在使用Spring Boot创建一个简单的Rest服务。我喜欢自定义异常,默认情况下日志中没有堆栈跟踪,并且使用基本异常详细信息(状态,错误,消息)创建了json响应。

问题在于它也根本不创建任何日志条目,因此我将不得不手动执行此操作:

自订例外

@ResponseStatus(value = HttpStatus.CONFLICT)
public class DuplicateFoundException extends RuntimeException {
    public DuplicateFoundException(String message) {
        super(message);
    }
}

服务方法中抛出异常(在@RestController中)

if (!voteDao.findByItemAndUser(item, voteDto.getUserId()).isEmpty()) {
    log.warn("... already voted ...");   //TODO: don't do this for every throw
    throw new DuplicateFoundException("... already voted ...");
}

具有更多的异常会导致在每次抛出之前放置log语句,这是我认为的一种不好的方法。我尝试从服务方法中删除所有日志语句,并创建了@ControlledAdvice,在其中记录所有自定义异常并重新抛出它们,因此我仍然像以前一样得到漂亮的json:

@ControllerAdvice
public class RestExceptionHandler {
    private static final Logger log = Logger.getLogger(RestExceptionHandler.class);

    @ExceptionHandler
    public ModelAndView defaultErrorHandler(HttpServletRequest req, Exception e) throws Exception {
        if (AnnotationUtils.findAnnotation(e.getClass(), ResponseStatus.class) != null) {
            log.warn(e.getMessage());
        } else {
            log.error("...");
        }
        throw e;
    }
}

现在的问题是,我不仅看到日志条目,还看到自定义异常的堆栈跟踪,并且找不到解决该问题的方法。我认为问题是由再次抛出引起的。一种可能的解决方案是为异常创建一个自定义类,我将返回该类,但是我不喜欢这种想法,因为异常编组似乎可以正常工作。

有什么提示吗?谢谢。

罗尔瓦特:

解决方案是将异常处理留给spring boot,以便默认情况下不记录自定义异常,而记录其他异常。我从其余控制器中删除了@ControllerAdvice以及日志记录语句,并将日志记录语句添加到自定义异常构造函数中

public DuplicateFoundException(String message) {
    super(message);
    LOGGER.warn(message);
}

我不确定这是否是最好的方法,但是现在我仅在一个地方进行了自定义异常日志记录,而不必为每个异常重复log语句,也不必在日志中查看其堆栈跟踪或任何其他错误消息。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在Spring Boot应用程序中获取日志记录级别

Spring Boot 应用程序中的日志记录模式

Spring Boot自定义启动器,用于日志记录和分布式跟踪

如何在Spring MVC(非Spring Boot)应用程序中自定义Jackson

Spring Boot自定义错误页面堆栈跟踪

在Spring Boot应用程序中重定向到自定义错误页面时出错

使用IntelliJ在Spring Boot中自定义应用程序属性

在Spring Boot应用程序中创建自定义连接池

如何使用自定义记录器在Spring Boot中记录访问日志

在Spring Boot应用程序中何时何地应用日志记录

如何在Spring Boot应用程序中为Jetty服务器使用自定义主体内容自定义ErrorHandler类

自定义验证器,以防止在Rails 4应用程序中重叠约会?

在 Spring Boot 应用程序中动态更改日志记录级别

如何在Spring Boot 2.0.5应用程序中启用HttpClient连线日志记录?

在应用程序日志文件中记录Spring Boot Actuator的运行状况

在Spring Boot应用程序中在运行时更改日志记录级别

在Spring MVC应用程序中从异常日志记录更改为异常处理的最简单方法是什么?

当我尝试在Spring Boot应用程序中将自定义错误传递给客户端时发生异常

如何将自定义ApplicationContextInitializer添加到Spring Boot应用程序?

Spring Boot应用程序自定义验证注释不会触发

用于Spring Boot应用程序的Logback自定义数据库追加器

Spring Boot 中的 Jetty 自定义格式日志模式

在Spring Boot RESTful应用程序中,如何防止已登录的用户再次登录?

Spring Boot显示针对不同异常的自定义错误消息

Rest Service中的Spring Boot自定义异常

Spring Boot 2中针对Actuator和自定义API端点的单独身份验证提供程序

在 Spring Boot Cloud Foundry 应用程序中启用日志

Spring Boot应用程序中OrderedRequestContextFilter上的意外日志

在 spring-boot 应用程序中过滤日志