如何在akka中发送和接收动作时添加日志记录功能

cit*_*ity 9 scala akka

现在,我被要求在akka的演员中添加日志功能.

收到消息后,在处理消息之前,应将此消息写入日志.在发送消息之前,应首先记录此消息.

我想我应该覆盖Actor中的receivesend函数.假设我创建了一个actorlog扩展的特征Actor.课程myActor延伸actorlog.但在myActor,我需要覆盖receive功能(这似乎导致问题).所以我很困惑我该做什么.

PS.我知道akka提供日志记录.但现在我需要自己实现这个功能.

Bjö*_*son 25

有一个实用程序可以在Akka中记录收到的消息.在日志记录文档中简要提到.基本上你将你的接收函数包装成如下:

def receive = LoggingReceive {
                // your normal receive here
              }
Run Code Online (Sandbox Code Playgroud)

然后在配置中启用它:

akka.actor.debug.receive=on
Run Code Online (Sandbox Code Playgroud)

将在调试级别记录信息.


sou*_*ica 9

除了这里的其他答案,另一种方法是使用orElse前置部分功能到你的receive.在该部分函数中,将登录信息放入,isDefinedAt以便在每条消息上调用它.

例如:

trait ReceiveLogger {
  this: Actor with ActorLogging =>

  def logMessage: Receive = new Receive {
    def isDefinedAt(x: Any) = {
      log.debug(s"Got a $x")
      false
    }
    def apply(x: Any) = throw new UnsupportedOperationException  
  }
}  

class MyActor extends Actor with ActorLogging with ReceiveLogger {
  def receive: Receive = logMessage orElse {
     case ...
  }
}
Run Code Online (Sandbox Code Playgroud)

使用orElse是编写receive行为的一般方法.在大多数情况下,我正在撰写如下内容:

def otherBehavior: Receive = {
  case OtherMessage => ...
}

class MyActor extends Actor {
  def receive = otherBehavior orElse {
    case ...
  }
} 
Run Code Online (Sandbox Code Playgroud)

可堆叠特征方法的一个很好的例子可以在这个演示文稿中看到:http://www.slideshare.net/EvanChan2/akka-inproductionpnw-scala2013