我已经使用@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,这里缺少一些我需要的特定方法。
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.info
或log.warn
或log.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中很有用。通过抛出异常,我们允许调用者对其进行处理,并通过记录日志,我们可以自行确定其根本原因。 而且,如果调用者在同一系统中,则