如何在日志中写入完整的堆栈跟踪?

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

log.warn(e.getMessage()); 

但它说的都是

 null 

所以我改成了

 log.warn(e.toString()); 

现在只说了

 java.lang.NullPointerException 

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

通常:

 log.warn("message", e); 

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

您可以使用

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

要么

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

资源:

  • 如何使用Log4J(或Commons Logging)打印exception的堆栈跟踪
  • logging.apache.org – Category

在您的exception方法中,包含该消息的基础Stringnull

上面的答案,现在已经删除了,除了e不是null,但是Throwable类上的detailMessage私有实例变量为null,这就是为什么e.getMessage()是String null ,但是e.toString() (调用底层null detailMessage.toString )会抛出NullPointerException

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

logger.error(“发生错误”,exception); 第一个参数是要显示的消息,第二个参数是exception(throwable),其堆栈跟踪被记录。

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

log.error(“消息”,exception);

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

logger.log(Level.SEVERE,“Message”,exception);

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

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

也许你正在寻找这样的东西: http : //www.javapractices.com/topic/TopicAction.do?Id=78

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