【发布时间】:2023-04-01 12:36:01
【问题描述】:
在我的 play 应用程序中,我像您通常在代码中所做的一样记录日志(跟踪、调试、错误等)。
对于那些我没有捕捉到的错误,我可以将我的日志记录放在哪里,以便它缓存我错过的错误?是否有一个我可以挂钩的中心事件来捕获所有错误?
另外,当我的应用程序中出现错误时,我应该如何显示友好的错误页面? (以及如何在开发中显示错误,以及在生产环境中自定义错误页面)
【问题讨论】:
标签: scala playframework
在我的 play 应用程序中,我像您通常在代码中所做的一样记录日志(跟踪、调试、错误等)。
对于那些我没有捕捉到的错误,我可以将我的日志记录放在哪里,以便它缓存我错过的错误?是否有一个我可以挂钩的中心事件来捕获所有错误?
另外,当我的应用程序中出现错误时,我应该如何显示友好的错误页面? (以及如何在开发中显示错误,以及在生产环境中自定义错误页面)
【问题讨论】:
标签: scala playframework
https://www.playframework.com/documentation/2.3.x/ScalaGlobal#Providing-an-application-error-page
object Global extends GlobalSettings {
override def onError(request: RequestHeader, ex: Throwable) = {
if (! Play.isProd) super.onError(request, ex)
else
Future.successful(InternalServerError(
views.html.errorPage(ex)
))
}
}
【讨论】:
play run 是开发模式。生产模式可以通过play start 或此处列出的方法启动:playframework.com/documentation/2.3.x/Production
Result,您可以像普通操作一样返回 Json 对象
您可以通过扩展 GlobalSettings 特征并覆盖 onError 方法来做到这一点。
import play.api.GlobalSettings
import play.api._
import play.api.mvc._
import play.api.mvc.Results._
import scala.concurrent.Future
object Global extends GlobalSettings {
override def onError(request: RequestHeader, e: Throwable) = {
Logger.error(e.getMessage)
Future.successful(InternalServerError(views.html.defaultError()))
}
}
请注意,此Global 对象必须在默认包中才能工作。只要Action 中存在未处理的异常,就会调用onError。在那里,您可以访问原始的Request,以及引发的异常。在这里,我只是记录异常消息并返回带有一些错误视图的Result。
【讨论】: