如何在catch子句之外记录堆栈跟踪

时间:2014-06-30 12:55:06

标签: java logging log4j

对于从不同站点调用的方法中很少发生的情况,我希望在日志中包含堆栈跟踪。异常条件是通过异常检测到的,即没有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并自行格式化并不能让我这样做。

我意识到&#34;很少发生&#34;为了使用异常而重构的代码的尖叫声。另一方面,除了异常之外,我所做的就是记录它们,因为问题不是真正的错误,而是指示可疑的API使用情况。所以似乎有点不做直接记录它们。

2 个答案:

答案 0 :(得分:1)

一些log4j方法接受一个Throwable对象。 Throwable包含其创建时线程执行堆栈的快照。您应该可以按如下方式使用它:

static void logWithStacktrace(Logger logger, Priority p, String msg) {
    logger.log(p, msg, new Exception());
}

答案 1 :(得分:0)

您可以尝试以下方法:

Thread.currentThread().getStackTrace();

这将返回一个StackTraceElement数组,您可以根据需要循环并处理它。请注意,第一个元素通常是getStackTrace()调用,因此您可能希望跳过它。