当前位置: 首页 > 知识库问答 >
问题:

Sl4j记录器与ResponseEntityExceptionHandler一起用于捕获异常时不记录

陶飞鸿
2023-03-14

我已经使用@controlleradvice创建了一个catch-all异常处理程序,以捕获所有异常并相应地进行日志记录。但是,由于某种原因,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,但我不确定这是否与龙目岛有关。我可以看到超类(ResponseEntityExceptionHandler)有自己的Logger,所以我不认为发生了任何奇怪的变量隐藏,但我不确定。

我非常肯定我的日志记录配置文件和配置是正确的,因为它可以在其他地方工作,除了在这个catch-all异常处理程序内。它只是不在日志中打印任何内容。

更新:

我可以使用超类中的logger,它可以工作。但是,它使用了apache commons-logging,这里缺少一些我需要的特定方法。

共有1个答案

颛孙沈义
2023-03-14

spring boot默认日志级别为info,因此debug日志将被抑制。我稍微修改了一下你的代码来重现这个问题。

@ExceptionHandler(Exception.class)
public ResponseEntity<Object> catchAllExceptionHandler(Exception ex) {
  log.info("******");
  log.debug("An issue has occurred, {}", ex.getMessage());
  log.info("An issue has occurred, {}", ex.getMessage());
  log.info("******");
  return ResponseEntity.status(500).build();
}

上面代码的输出:
只查看打印的信息日志。

2020-09-03 22:25:45.065  INFO c.e.demo.main.CatchAllExceptionHandler   : ******
2020-09-03 22:25:45.065  INFO c.e.demo.main.CatchAllExceptionHandler   : An issue has occurred, test exception
2020-09-03 22:25:45.065  INFO c.e.demo.main.CatchAllExceptionHandler   : ******

解决方案1:
log.debug更改为log.infolog.warnlog.error。这更适合你的情况。

解决方案2:
添加一个属性,以便在应用程序.properties中启用CatchallexCeptionHandler的调试日志。

logging.level.com.example.demo.main.CatchAllExceptionHandler=debug

添加上述属性后的输出:

2020-09-03 22:36:05.389  INFO c.e.demo.main.CatchAllExceptionHandler   : ******
2020-09-03 22:36:05.389 DEBUG c.e.demo.main.CatchAllExceptionHandler   : An issue has occurred, test exception
2020-09-03 22:36:05.389  INFO c.e.demo.main.CatchAllExceptionHandler   : An issue has occurred, test exception
2020-09-03 22:36:05.389  INFO c.e.demo.main.CatchAllExceptionHandler   : ******
 类似资料:
  • 问题内容: 最近,我问是否要报告捕获到的异常的文本。出乎意料的是,大多数答案都误解了我的问题,并以为我在问是否要报告堆栈跟踪以获取捕获的异常,这表明这样做是正常的。所以我要问一个后续问题。 在例外情况下,应该或不应该在什么情况下报告堆栈跟踪?通过“报告”,我包括要求一个日志记录框架为您记录堆栈跟踪 我不问是否报告 的东西 。我在问那个报告是否应该包括堆栈跟踪。 问题答案: 它取决于上下文。例如,当

  • 如何在SL4J中配置日志记录?我的项目有很多类:class1、class2、Class3....我想做两件事:将所有类记录到一个名为FILE1的文件追加器中,并具有警告级别(class1、class2、class3...)将一个名为class1的类记录到具有调试级别的名为FILE2的文件追加器中。 问题是,当我将class1的记录器配置为具有WARN级别的FILE1 appender时,我不知道如

  • 我的项目依赖于scala日志库,我正在尝试升级我的项目以使用dotty。为此,我从https://github.com/lampepfl/dotty-example-project克隆了示例dotty项目并更新了它,包括日志库。请在下面找到项目的目录结构:- 项目/build.properties:- 项目/plugins.sbt 建筑sbt公司 src/main/scala/main。斯卡拉 上

  • 我陷入了一个循环,无法完全理解为什么当我的war部署到tomcat时没有输出日志-但是,如果我通过intellij在本地运行单元测试,日志文件将按预期填充。 web.xml包含: 最后,相关的依赖关系: 我在spring依赖项中包含了以下内容:

  • 这个问题不是关于Rollbar tho:)

  • 问题内容: 下面的编码方法是好的做法吗? 而且,我应该 仅使用记录器? 只抛出异常? 两者都做吗? 我知道可以在调用堆栈的另一部分捕获异常,但是也许其他日志记录有一些隐藏的好处,并且也很有用。 问题答案: 在某些情况下,我会同时使用日志记录和引发异常。特别是,它在API中很有用。通过抛出异常,我们允许调用者对其进行处理,并通过记录日志,我们可以自行确定其根本原因。 而且,如果调用者在同一系统中,则