Java日志记录和抛出异常

时间:2014-03-20 17:38:07

标签: java exception logging

我知道这是一个反模式,但在我的RESTful应用程序中,我想记录并抛出。

我有这个代码

log.warn("Cannot determine provider from name: " + name);
throw X.bad("Cannot determine provider from name: " + name);

这是不应该发生的情况 - 它只是if / else if系列中的最后一个。但是,如果它确实发生,它可能表示前端错误/错误。

  1. 我的restful堆栈可以处理异常并将它们映射到HTTP响应。
  2. 我还想要一个具有良好堆栈跟踪的日志条目。
  3. 我希望日志条目与它被抛出的地方有关(即记录器类别(类名)和堆栈跟踪。
  4. 我确实想过将一个log.warn(...)放在X.bad()中,但后来记录类是X,并且堆栈跟踪比需要抛出异常时更大。

    有没有人有更集成的解决方案?

    (我想要停止重复文本组件而不是任何事情)

    由于

    罗布

1 个答案:

答案 0 :(得分:3)

来自Barry Ruzek的2007年文章报道了这个问题。 http://www.oracle.com/technetwork/articles/entarch/effective-exceptions-092345.html

整体解决方案是在调用堆栈的上层设置故障屏障。此故障屏障将替换您的步骤1.它将捕获所有异常,并相应地记录它。

我认为您未检查的事情是创建一个自定义异常,扩展RuntimeException(即MyAppRuntimeException),并在其中添加您需要记录日志的级别,以及您要传输给您的任何其他字段故障障碍。

您的故障障碍还需要捕获所有其他异常(异常,运行时等)并使用默认行为管理它们。

在抛出异常之前,您不需要记录,只需要在一个地方登录:当您捕获具有故障障碍的异常时。

如果您记录堆栈跟踪,而不仅是消息,您仍然可以在日志中看到问题的根源。

之后,你继续这样做。发回ReST消息。