简体   繁体   English

如何使用“登录Akka actor”?

[英]How to use Logging into Akka actor?

Can I set Logging in Akka actor by implicit? 我可以通过隐式设置“登录Akka actor”吗? I would like to log inside the actor. 我想登录演员。 My code is as given below: 我的代码如下所示:

object EmployeeRouterActor {
  final case class Employee(id: Long, name: String)
  final case object StopChild
  final case class ChildResponse(id: Long, name: String)
}

final class EmployeeRouterActor extends Actor with akka.actor.ActorLogging {

  import EmployeeRouterActor._

  private var children = Map.empty[Long, ActorRef]

  override def receive: Receive = {
    case e @ Employee(id, _)  => {
      getChild(id) ! e
    }
    case r @ ChildResponse(id, _) => {
      stopChild(id)
      val idItem = r.id
      val nameItem = r.name
      sender ! s"Employee {$idItem} is $nameItem."
    }
  }

  private def getChild(id: Long): ActorRef =
    context.child(id.toString).getOrElse {
      val child = context.actorOf(EmployeeEchoActor.apply(), id.toString)
      children += (id -> child)
      child
    }

  private def stopChild(id: Long) = {
    children(id) ! StopChild
    children -= id
  }

}

But, in this case, I can not do something like this: 但是,在这种情况下,我无法执行以下操作:

class EmployeeRouterActor (implicit logger: LoggingAdapter) { ... }

I have got following errors: 我有以下错误:

Error:(10, 30) could not find implicit value for parameter logger: akka.event.LoggingAdapter
  def apply(): Props = Props(new EmployeeEchoActor)

Error:(10, 30) not enough arguments for constructor EmployeeEchoActor: (implicit logger: akka.event.LoggingAdapter)actors.EmployeeEchoActor.
Unspecified value parameter logger.
  def apply(): Props = Props(new EmployeeEchoActor)

Is it possible to use Logging from Akka inside the actors? 可以在演员内部使用Akka中的Logging吗?

EmployeeEchoActor (child actor) is defined as given below: EmployeeEchoActor(子演员)的定义如下:

object EmployeeEchoActor {
  def apply(): Props = Props(new EmployeeEchoActor)
}

class EmployeeEchoActor(implicit logger: LoggingAdapter) extends Actor {

  override def receive = {

    case employee: EmployeeRouterActor.Employee => {
      logger.info("Message received!")
      val idItem = employee.id
      val nameItem = employee.name
      context.parent ! EmployeeRouterActor.ChildResponse( idItem, nameItem )

    }
    case EmployeeRouterActor.StopChild => {
      logger.info("Stopping :(!")
      context.stop(self)
    }
    case _ => sender ! "Internal Error!"
  }

}

The solution is: 解决方案是:

final class EmployeeRouterActor extends Actor with akka.actor.ActorLogging {

Implement ActorLogging and use log at code, for example: 实现ActorLogging并在代码中使用日志,例如:

override def receive: Receive = {
    case e @ Employee(id, _)  => {
      log.info("Message received!")
      getChild(id) ! e
    }
    case r @ ChildResponse(id, _) => {
      log.info("Response received from child!")
      stopChild(id)
      log.info("Child has been stopped!")
      val idItem = r.id
      val nameItem = r.name
      sender ! s"Employee {$idItem} is $nameItem."
    }

  }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM