加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 如何在Akka演员中记录未捕获的例外?

发布时间:2020-12-16 09:31:45 所属栏目:安全 来源:网络整理
导读:我们一直很难在Play 2.0.4应用程序中检测和调查我们的Akka演员的错误。 如何在Akka演员中获得所有未捕获的异常,以便使用有用的堆栈跟踪进行记录? 迄今为止我们能够做的最好的事情是将以下内容添加到application.conf中: logger.akka=DEBUGakka { loglevel
我们一直很难在Play 2.0.4应用程序中检测和调查我们的Akka演员的错误。

如何在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
        }
    }
}

但是,给定以下演员:

class ThrowingActor{
  def receive = {
    case _ => {
      throw new Exception("--------------ASDFASDFASDFASDFASDFASDFASDF------------------")
    }
  }
}

我们看到的所有记录都是:

[DEBUG] [03/06/2013 16:15:44.311] [application-akka.actor.default-dispatcher-16] [Future] --------------ASDFASDFASDFASDFASDFASDFASDF------------------

任何人都可以帮助我们获取所有演员的信息叠加,当有一个未被捕获的例外?

谢谢。

解决方法

如果您无法在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")
  }
}

当发生未捕获的异常并且actor即将重新启动时,将重新启动。似乎是一个很好的地方挂钩你自己的更详细的记录。作为奖励,导致失败的接收到的消息可用于日志中的其他上下文。

你还可以重构这个代码,以便设置可堆叠的特征,以防止已经覆盖preRestart的其他actor

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读