繁体   English   中英

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

[英]How to log stack trace outside of catch clause

对于从不同站点调用的方法中很少发生的情况,我想在日志中进行堆栈跟踪。 异常情况是通过异常检测到的,即没有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());
}

您可以尝试以下方法:

Thread.currentThread().getStackTrace();

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM