对于从不同站点调用的方法中很少发生的情况,我想在日志中进行堆栈跟踪。异常情况是通过异常检测到的,即没有try-catch。
我知道的唯一方法是使用伪造的异常,如下所示:
static void logWithStacktrace(Logger logger, Priority p, String msg) {
try {
throw new AssertionError();
} catch (AssertionError e) {
logger.log(p, msg, e);
}
}
是否有一个很好的方法可以做到这一点而又不会引发异常?也许有一个我忽略的log4j功能?我正在寻找一种解决方案,可将堆栈跟踪的格式设置为真实异常消息中的格式-理想情况下,它将最终作为XML日志文件中的
<log4j:throwable>
元素结束。我自己使用Thread.getStackTrace
对其进行格式化并不允许我这样做。我知道,“很少发生”的尖叫声要求代码重构为使用异常。另一方面,由于异常不是真正的错误,而是表示API使用存在问题,因此我只需要记录这些异常。因此,似乎将其设计为不直接对其进行记录。
最佳答案
一些log4j方法接受Throwable对象。 Throwable包含创建时其线程的执行堆栈的快照。您应该能够如下使用它:
static void logWithStacktrace(Logger logger, Priority p, String msg) {
logger.log(p, msg, new Exception());
}
关于java - 如何在catch子句之外记录堆栈跟踪,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24490636/