9

现在,我被要求在 akka 的 actor 中添加日志记录功能。

当收到一条消息时,在处理它之前,应该将这条消息写入日志。在发送消息之前,应首先记录此消息。

我想我应该重写 Actor 中的receiveandsend函数。假设我创建了一个actorlog扩展特征Actor。和类myActor扩展actorlog。但是在 中myActor,我需要重写receive函数(它似乎在这里引起了问题)。所以我很困惑我应该做什么。

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

4

3 回答 3

25

在 Akka 中有一个实用程序可以记录收到的消息。日志记录文档中简要提到了它。基本上,您将接收函数包装在其中,如下所示:

def receive = LoggingReceive {
                // your normal receive here
              }

然后你在你的配置中启用它:

akka.actor.debug.receive=on

该信息将在调试级别记录。

于 2013-11-07T08:54:23.293 回答
10

除了这里的其他答案之外,另一种方法是使用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 ...
  }
}

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

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

class MyActor extends Actor {
  def receive = otherBehavior orElse {
    case ...
  }
} 

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

于 2013-11-07T14:45:54.870 回答
2
  1. 使用可堆叠修饰符abstract override进行可堆叠的方法调用receive
  2. 使用 Akka 的新功能:事件源演员系统(此处的文档)。
于 2013-11-07T07:16:12.540 回答