我正在捕获异常并尝试将堆栈跟踪写入日志,如下所示:
log.warn(e.getMessage());
但它说的只是
null
所以我把它改成了
log.warn(e.toString());
现在只说
java.lang.NullPointerException
如何将完整堆栈跟踪写入日志,以便查看应用程序中生成此异常的位置?
答案 0 :(得分:34)
一般:
log.warn("message", e);
但这也取决于你的日志框架。
答案 1 :(得分:9)
您可以使用
logger.log(Level.WARN, "logged exception", ex);
或
logger.warn("logged exception", ex);
资源:
答案 2 :(得分:4)
使用log4j完成:
logger.error("An error occurred", exception);
第一个参数是要显示的消息,第二个参数是异常(throwable),其堆栈跟踪被记录。
另一个选项是commons-logging,它是相同的:
log.error("Message", exception);
使用java.util.logging可以通过以下方式完成:
logger.log(Level.SEVERE, "Message", exception);
答案 3 :(得分:3)
在您的异常方法中,包含该消息的基础String
为null
。
上面的答案,现在已经删除了,除了e
不为空,但detailMessage
类上的Throwable
私有实例变量为空,这就是为什么{ {1}}是字符串e.getMessage()
,但null
(调用底层 null e.toString()
)会抛出detailMessage.toString
。
答案 4 :(得分:2)
如果您使用java8,则可以执行以下操作:
LOGGER.error("Caught exception while methodX. Please investigate: "
+ exception
+ Arrays.asList(exception.getStackTrace())
.stream()
.map(Objects::toString)
.collect(Collectors.joining("\n"))
);
答案 5 :(得分:1)
也许你正在寻找这样的东西: http://www.javapractices.com/topic/TopicAction.do?Id=78
答案 6 :(得分:0)
如果您使用的是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")));