2017-04-26 44 views
0

我可以通过隐式设置在Akka actor中记录日志吗?我想登录演员。我的代码如下:如何使用Logging入Akka actor?

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 
    } 

} 

但是,在这种情况下,我不能做这样的事情:

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

我有以下错误:

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) 

是它可以在演员中使用来自Akka的Logging吗?

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!" 
    } 

} 
+0

如下面给出的

EmployeeEchoActor(儿童演员)被定义你在创建'EmployeeEchoActor'的地方有一个'implicit val LoggingAdapter'并将它传递给t他是'Props'构造函数? – Harald

+0

我刚刚更新了帖子以显示EmployeeEchoActor。我通过Logging,但我不知道如何重构Porps构造函数。这是我第一次在Akka,在Google或这里找不到类似的东西。 –

+2

您是否看过此页? http://doc.akka.io/docs/akka/2.0/scala/logging.html – Harald

回答

2

的解决方案是:

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

实施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." 
    } 

    }