【发布时间】:2020-12-22 15:28:02
【问题描述】:
我使用@ControllerAdvice 创建了一个包罗万象的异常处理程序来捕获所有异常并相应地记录。但是,由于某种原因,sl4j 记录器无法登录到控制台。同一个记录器在我的应用程序中的所有其他地方都可以工作,但它在 catch-all 异常处理程序中不起作用。
@ControllerAdvice
@Slf4j
public class CatchAllExceptionHandler extends ResponseEntityExceptionHandler {
private ResponseEntity<Object> buildResponseEntity(ApiError apiError) {
return new ResponseEntity<>(apiError, apiError.getStatus());
}
@ExceptionHandler(Exception.class)
public ResponseEntity<Object> catchAllExceptionHandler(Exception ex) {
ApiError apiError =
ApiError.builder()
.status(HttpStatus.INTERNAL_SERVER_ERROR)
.message("An internal service issue")
.debugMessage(ex.getMessage())
.build();
log.debug("An issue has occurred, {}, {}", kv("message", ex.getMessage()),
kv("trace", ex.getStackTrace()));
return buildResponseEntity(apiError);
}
}
Sl4j 来自 Lombok 已被使用,但我不确定这是否与 Lombok 有关。我可以看到超类(ResponseEntityExceptionHandler)有自己的logger,所以我认为没有发生任何奇怪的变量隐藏,但我不确定。
我很确定我的日志记录配置文件和配置是正确的,因为它可以在除了这个包罗万象的异常处理程序之外的任何其他地方工作。它只是不会在日志中打印任何内容。
更新:
我可以使用超类中的记录器并且它可以工作。但是,它使用了 apache commons-logging,但这里缺少一些我需要的特定方法。
【问题讨论】:
标签: spring-boot logging slf4j lombok