2017-04-26 60 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." 
    } 

    }