仅在控制台上记录文件中的ExceptionInInitializerError

时间:2014-08-27 17:36:27

标签: scala logging playframework-2.0 logback playframework-2.2

我在播放框架2.2.4中使用了logback 1.7.5,在工作期间我遇到了这样的错误:

Exception in thread "Thread-5" java.lang.ExceptionInInitializerError
    at controllers.db.SyncDBManager.createDeviceCollectionsIfNotExists(SyncDBManager.scala)
    at server.impl.logic.controller.DeviceInitializer.checkAuthenticationResponse(DeviceInitializer.java:226)
    at server.impl.logic.controller.DeviceInitializer.processReceivedFrames(DeviceInitializer.java:117)
    at server.impl.logic.controller.DeviceController.onReceivedPackets(DeviceController.java:77)
    at server.impl.logic.io.DeviceReader.run(DeviceReader.java:130)
Caused by: java.util.NoSuchElementException: None.get
    at scala.None$.get(Option.scala:313)
    at scala.None$.get(Option.scala:311)
    at controllers.base.MongoSyncHelper$class.$init$(MongoSyncHelper.scala:16)
    at controllers.db.SyncDBManager$.<init>(SyncDBManager.scala:32)
    at controllers.db.SyncDBManager$.<clinit>(SyncDBManager.scala)
    ... 5 more

但只有在控制台上,如何捕获此异常并将其写入文件?

1 个答案:

答案 0 :(得分:1)

看起来像是用sysout打印的控制台中的普通堆栈跟踪。根据您的设计,如果要使用Play记录器记录异常,则应通过将异常作为参数之一传递给具有记录器方法之一的catch块。例如:

try {
  // code
} catch {
  case e: Exception => play.api.Logger.error("An error occurred", e)
}

记录器级别取决于您。如果您没有catch块并且想要记录在应用程序的任何位置发生的意外异常,则应通过覆盖 onError 方法将其记录在Global对象中。

override def onError(request: RequestHeader, e: Throwable): Future[SimpleResult] = {
  play.api.Logger.error("An error occurred", e)
  super.onError(request, e)
}

请记住,仅在生产模式下调用 onError 方法。