如何使用Logging入Akka actor?
问题描述:
我可以通过隐式设置在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!"
}
}
答
的解决方案是:
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."
}
}
如下面给出的
EmployeeEchoActor(儿童演员)被定义你在创建'EmployeeEchoActor'的地方有一个'implicit val LoggingAdapter'并将它传递给t他是'Props'构造函数? – Harald
我刚刚更新了帖子以显示EmployeeEchoActor。我通过Logging,但我不知道如何重构Porps构造函数。这是我第一次在Akka,在Google或这里找不到类似的东西。 –
您是否看过此页? http://doc.akka.io/docs/akka/2.0/scala/logging.html – Harald