有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何在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使用的迹象。因此,不直接记录它们似乎有点做作


共 (1) 个答案

  1. # 1 楼答案

    有几个log4j方法接受可丢弃的对象。Throwable包含创建线程时线程执行堆栈的快照。您应该能够按如下方式使用:

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