Chr*_*ris 18 scala akka playframework-2.0
我们一直很难在Play 2.0.4应用程序中检测和调查Akka actor中的错误.
如何使用有用的堆栈跟踪记录Akka演员中所有未捕获的异常?
到目前为止,我们能够做到的最好的事情是将以下内容添加到application.conf:
logger.akka=DEBUG
akka {
loglevel = DEBUG
stdout-loglevel = DEBUG
loggers = ["akka.event.slf4j.Slf4jLogger"]
actor {
debug {
receive = on
autoreceive = on
fsm = on
lifecycle = on
unhandled = on
event-stream = on
router-misconfiguration = on
}
}
}
Run Code Online (Sandbox Code Playgroud)
但是,鉴于以下演员:
class ThrowingActor{
def receive = {
case _ => {
throw new Exception("--------------ASDFASDFASDFASDFASDFASDFASDF------------------")
}
}
}
Run Code Online (Sandbox Code Playgroud)
我们看到的所有记录都是:
[DEBUG] [03/06/2013 16:15:44.311] [application-akka.actor.default-dispatcher-16] [Future] --------------ASDFASDFASDFASDFASDFASDFASDF------------------
Run Code Online (Sandbox Code Playgroud)
当有未捕获的异常时,任何人都可以帮助我们在所有演员中获取信息性的堆栈跟踪吗?
谢谢.
如果您无法在Akka中找到开箱即用的处理方式,那么您可以创建一个简单的特性混合到您的演员中,如下所示:
import akka.actor._
trait UnhandledExceptionLogging{
self: Actor with ActorLogging =>
override def preRestart(reason:Throwable, message:Option[Any]){
super.preRestart(reason, message)
log.error(reason, "Unhandled exception for message: {}", message)
}
}
class MyActor extends Actor with ActorLogging with UnhandledExceptionLogging{
def receive = {
case _ =>
throw new Exception("blah blah")
}
}
Run Code Online (Sandbox Code Playgroud)
当发生未捕获的异常并且即将重新启动actor时,将调用预重新启动.似乎是一个很好的地方可以挂钩你自己更详细的日志记录.作为奖励,导致失败的接收消息可用于日志中的附加上下文.
您还可以稍微重构此代码以将特征设置为可堆叠,以防您有其他已经覆盖的actor preRestart
当您使用 slf4j 记录器时,Akka 的日志记录配置不再使用。根据您的日志记录框架和设置,您可能必须:
通常,当系统启动时,它会打印有关日志记录框架的一些详细信息(特别是如果配置错误)。原因可能有很多,但您很可能查找了错误的配置文件。
| 归档时间: |
|
| 查看次数: |
4603 次 |
| 最近记录: |