繁体   English   中英

您如何将完整的堆栈跟踪写入日志?

[英]How do you write a full stack trace to the log?

我正在捕获异常并尝试将堆栈跟踪写入日志,如下所示:

log.warn(e.getMessage());

但它所说的只是

null

所以我把它改成

log.warn(e.toString());

现在它只说

java.lang.NullPointerException

如何将完整的堆栈跟踪写入日志,以便我可以看到在应用程序中生成此异常的位置?

通常:

log.warn("message", e);

但这也取决于您的日志记录框架。

你可以使用

logger.log(Level.WARN, "logged exception", ex);

logger.warn("logged exception", ex);

资源:

使用 log4j,这是通过以下方式完成的:

logger.error("An error occurred", exception);

第一个参数是要显示的消息,第二个参数是记录堆栈跟踪的异常(可抛出)。

另一种选择是 commons-logging,它是相同的:

log.error("Message", exception);

使用 java.util.logging 这可以通过以下方式完成:

logger.log(Level.SEVERE, "Message", exception);

如果您使用 Java 8,您可以执行以下操作:

LOGGER.error("Caught exception while methodX. Please investigate: " 
    + exception 
    + Arrays.asList(exception.getStackTrace())
    .stream()
    .map(Objects::toString)
    .collect(Collectors.joining("\n"))
);

在您的异常方法中,包含消息的基础Stringnull

上面的答案,现在被剔除,仍然成立,除了e不为 null,但Throwable类上的detailMessage私有实例变量为 null,这就是为什么e.getMessage()是 String null ,而e.toString() (调用底层null detailMessage.toString )抛出NullPointerException

如果你使用的是 8 之前的 Java 版本,你可以试试这个:

            LOGGER.error("Error al recuperar proveedores de la base de datos: " + 
            e + Arrays.asList(e.getStackTrace()).stream().map(new Function(){
                    @Override
                    public Object apply(Object t) {
                        return t.toString();
                    }
                }).collect(Collectors.joining("\n")));

暂无
暂无

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

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