如何使Play打印所有错误

时间:2014-05-01 08:02:27

标签: scala logging playframework reactivemongo

在我们的Scala,Play,Reactivemongo中,我们遇到异常处理的一个大问题 - 当出现错误时,在Iteratee / Enumeratee或Actor系统Play中只是吞下它,而不会在输出中记录任何错误。所以我们实际上需要猜测可能发生错误的位置和原因。

我们使Globals覆盖,总是打印错误,并指定logger.root=TRACE,但仍然没有看到输出,我们可以从中分析我们的问题。

如何强制让Play打印所有错误

3 个答案:

答案 0 :(得分:1)

没有找到明确记录所有内容的方法,但有一种方法可以在本地记录异常。

我这样做了:

def recover[T] = Enumeratee.recover[T] {
  case (e, input) => Logger.error("Error happened on:" + input, e)
}

然后在所有可能产生错误的枚举上使用它

def transform(from: Enumerator[From]): Enumerator[String] = {
  heading >>> (from &> recover[From] ><> mapper) >>> tailing
}

这里,mapper抛出异常,它们都被记录下来。

答案 1 :(得分:0)

我认为你的问题在于Future如何在scala中运行,让我们看看以下例子:

val f :Future[Int]= Future {
     throw new NullPointerException("NULL")
     1
}
f.map(s1 => {println(s" ==>  $s1");s" ==>  $s1"})

此代码将引发异常,但不会打印堆栈跟踪,因为future会处理错误。

如果您想获得发生的错误,可以 只需致电:

f.onComplete{
    case Success(e) => {}
    case Failure(e) => e.printStackTrace()
}

e是一个throwable,您可以使用它来处理错误。

答案 2 :(得分:0)

在我使用的解决方案中,通过Play https://www.playframework.com/documentation/2.4.2/ScalaErrorHandling中的ErrorHandling覆盖,基本上创建了记录所有错误的ErrorHandler,并且需要使用detalization。