似乎是一个相当直截了当的问题,但我想在触发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技术来解决。在这一点上我能做些什么来抓取stacktrace吗?我不确定请求是否与错误处理程序在同一线程上,否则可能会有一些答案。e.getStackTrace()给了我[Ljava.lang.StackTraceElement;@1f6b6954。
在这里打印一个堆栈跟踪的最好方法是什么,这样我就可以记录并查看它来修复我的糟糕代码中的错误?
使用apache commons lang中的exceptionutils:
import org.apache.commons.lang3.exception.ExceptionUtils
(...)
logger.info("an exception occurred:" + ExceptionUtils.getStackTrace(e))
如果使用标准记录器: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个参数(字符串和可丢弃)的重载。
这个问题有几种方法可以将异常堆栈跟踪转换为字符串。除非提供编写器,否则将printstacktrace输出到system.err。
我认为您需要printstacktrace()而不是getstacktrace。如果要输出到日志文件,getMessage()可能会有所帮助。或者您可以尝试将整个异常对象传递给记录器。