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

Java 如何将完整堆栈跟踪写入日志?,java,stack-trace,Java,Stack Trace,我捕获了一个异常,并尝试将堆栈跟踪写入日志,如下所示: log.warn(e.getMessage()); 但它所说的只是 null 所以我把它改成了 log.warn(e.toString()); 现在它只说 java.lang.NullPointerException 如何将完整堆栈跟踪写入日志,以便查看在应用程序中生成此异常的位置?通常: log.warn("message", e); 但这也取决于您的日志框架。您可以使用 logger.log(Level.WARN, "logg

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

log.warn(e.getMessage());
但它所说的只是

null
所以我把它改成了

log.warn(e.toString());
现在它只说

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

通常:

log.warn("message", e);
但这也取决于您的日志框架。

您可以使用

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


资源:


在异常方法中,包含消息的底层
字符串是
null


上面的答案现在被删除了,除了
e
不是null,但是
Throwable
类上的
detailMessage
私有实例变量是null,这就是为什么
e.getMessage()
是字符串
null
,而
e.toString()
(调用底层null
detailMessage.toString
)使用log4j抛出
NullPointerException

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

logger.error("An error occurred", exception);
第一个参数是要显示的消息,第二个参数是记录stacktrace的异常(throwable)

另一个选项是commons日志记录,它是相同的:

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"))
);

如果您使用的是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")));

如果e为null,log.warn(e.getMessage());将抛出异常,并且不会打印“null”。不,它不会,它将抛出一个NPEIt,它可以正常工作,并且在异常未正确记录的调试会话期间也很有用。我体验到上面的处理比log.error(“message”,e)慢得多;我已经试过调试会话,值得一试,特别是如果您编写了一个全局处理程序。Arrays.asList(…)。stream()可以简化为Arrays.stream(例如getStackTrace())
            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")));