2010-09-15 76 views
12

我捕获异常,并努力写出这样的堆栈跟踪日志:如何将完整的堆栈跟踪写入日志?

log.warn(e.getMessage()); 

但是,所有这说的是

null 

所以我改成了

log.warn(e.toString()); 

而现在它只说

java.lang.NullPointerException 

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

回答

28

一般:

log.warn("message", e); 

但是这取决于你的日志框架了。

3

在你的异常的方法,所述底层String包含讯息是null

以上回答,现在剔除,仍持有,但e不为空,但对ThrowabledetailMessage私有实例变量为空,这就是为什么e.getMessage()是字符串null,但e.toString()(其中调用底层nulldetailMessage.toString)抛出NullPointerException

+1

如果E为空,登录。警告(e.getMessage());会抛出异常并且不会打印“null”。 – 2010-09-15 11:49:41

+0

不,不会,它会抛出一个NPE – 2010-09-15 11:50:16

+0

对不起,我误读你的评论 – 2010-09-15 12:02:54

1

使用log4j的,这是与完成:

logger.error( “出现错误”,除外); 第一个参数是要显示的消息,第二个参数是堆栈跟踪记录的异常(可抛出)。

另一种选择是共享记录,在那里它是相同的:

log.error( “消息”,例外);

logger.log(等级:

随着java.util.logging中这可以通过来完成。SEVERE,“消息”,例外);

1

如果您使用java8你可以做到以下几点:

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

它工作得很好,而且在调试会话期间,当异常没有正确记录时它也很有用。 – alexandrul 2017-10-18 12:38:57

0

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

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