Scala 如何在akka中设置日志,以便正确显示参与者路径?

Scala 如何在akka中设置日志,以便正确显示参与者路径?,scala,logging,akka,akka-typed,Scala,Logging,Akka,Akka Typed,我无法在一个打字演员身上设置一个合适的记录器 这是我想要实现的日志行: INFO 16:27:50 com.example.Registry /user/client-0(akka://NumberRegistry) - received input 1. 试试1 我使用的是slf4j,这是目前我写的最好的设置代码,但这还不够 private val logger=Loggingcontext.system.toUntyped,context.self.path.ToString不带地址 输

我无法在一个打字演员身上设置一个合适的记录器

这是我想要实现的日志行:

INFO 16:27:50 com.example.Registry /user/client-0(akka://NumberRegistry) - received input 1. 
试试1 我使用的是slf4j,这是目前我写的最好的设置代码,但这还不够

private val logger=Loggingcontext.system.toUntyped,context.self.path.ToString不带地址 输出:

INFO 16:27:50 /user/client-0(akka://NumberRegistry) - received input 1.
我无法使用slf4j筛选此日志的可加性级别,因此无法区分系统日志和我的日志。您不能在logback.xml中像这样命名子路径

您只需在日志中获得一堆akka.actor.typed.internal.adapter.ActorSystemAdapter作为记录器名称

试试3 我试图通过覆盖genString和getClazz来创建自定义日志源:

对象MyType{ 隐式val logSource:logSource[AnyRef]=新的logSource[AnyRef]{ def genStringo:AnyRef:String=o匹配{ 案例o:ActorRef[\u]=>o.path.path.ToString不带地址 大小写uz=>o.getClass.getName } 覆盖def getClazzo:AnyRef:Class[]=o匹配{ 案例:ActorRef[\u]=>classOf[akka.event.DummyClassForStringSources] case=>o.getClass } } 但它不起作用,也不好

我读了全文,但没有详细说明akka键入的内容


如何在类型化的actor中设置正确设置了类名和actor路径的记录器?

如果使用context logger context.log,您将在MDC中获得所需的所有信息:

{
 timestamp=1557948214734,
 level=INFO, 
 thread=dependency-system-akka.actor.default-dispatcher-4,
 mdc={
      sourceThread=dependency-system-akka.actor.default-dispatcher-3,
      akkaSource=akka://dependency-system/user/pinger, 
      sourceActorSystem=dependency-system, 
      akkaTimestamp=19:23:34.731UTC
     },
 logger=akka.actor.typed.Behavior$,
 message=ping,
 context=default
}
要获得您想要的图案,请使用以下内容:

<encoder>
  <pattern>%-5level %d %logger{35} %mdc{akkaSource} - %msg%n</pattern>
</encoder>
INFO  2019-05-15 12:28:59,012 akka.actor.typed.Behavior$ akka://dependency-system/user/pinger - ping
唯一的问题是记录器默认为akka.actor.typed.Behavior$。但是您可以在上下文中初始化它:

object Pinger {
  sealed trait Command
  case object Ping extends Command

  Behaviors.setup { context =>
    context.setLoggerClass(this.getClass)

    Behaviors.receiveMessage[Command] {
      case Ping =>
        context.log.info("ping")
        Behaviors.same
    }
  }
}
导致

INFO  2019-05-15 12:52:52,911 x.x.actors.Pinger$ akka://dependency-system/user/pinger - ping

谢谢你提供了一半的解决方案。我希望Akka的作者们能提出一个更为用户友好的日志集成。笑话部分:如果不是别的,雇佣我,我会干净利落。
object Pinger {
  sealed trait Command
  case object Ping extends Command

  Behaviors.setup { context =>
    context.setLoggerClass(this.getClass)

    Behaviors.receiveMessage[Command] {
      case Ping =>
        context.log.info("ping")
        Behaviors.same
    }
  }
}
INFO  2019-05-15 12:52:52,911 x.x.actors.Pinger$ akka://dependency-system/user/pinger - ping