看起来像是一个相当直接的问题,但是当我触发Scalatra中的顶级错误处理程序时,我想记录堆栈跟踪。我故意在我的一个方法中抛出异常,做一些简单的事情:
throw new IllegalArgumentException
在错误处理程序中,代码如下所示:
error {
case e => {
val logger = LoggerFactory.getLogger(getClass)
logger.info("an exception occurred: " + e.getStackTrace())
logger.info("the request body is: " + request)
NotFound("An error occurred, please contact support")
}
}
错误处理程序本身是特定于Scalatra的,但我很确定我正在寻找的答案可以使用任何香草Scala技术来解决。在这一点上我能做些什么来抓住堆栈跟踪?我不确定请求是否与错误处理程序在同一个线程上,否则可能会有一些答案。 e.getStackTrace()
给了我[Ljava.lang.StackTraceElement;@1f6b6954
这里打印堆栈跟踪的最佳方法是什么,以便我可以记录并查看它以修复我可怕代码中的错误?
答案 0 :(得分:5)
使用Apache Commons Lang的ExceptionUtils:
import org.apache.commons.lang3.exception.ExceptionUtils
(...)
logger.info("an exception occurred: " + ExceptionUtils.getStackTrace(e))
答案 1 :(得分:3)
如果使用标准记录器:com.typesafe.scalalogging.Logger,记录器会为您打印堆栈跟踪。
你可以这样使用它:
import com.typesafe.scalalogging.Logger
import org.slf4j.LoggerFactory
try {
throw new Exception("test message")
} catch {
case e:Exception => logger.error("Exception " , e)
}
已经有一个重载接受2个参数,String和Throwable。
答案 2 :(得分:2)
我认为你想要printStackTrace()而不是getStackTrace。如果要输出到日志文件,getMessage()可能会有所帮助。或者您可以尝试将整个异常对象传递给记录器。
答案 3 :(得分:2)
This question有几种方法可以将异常堆栈跟踪转换为String。除非您提供编写器,否则printStackTrace会输出到System.err。