如何设置akka型日志记录,以便正确显示actor路径?

时间:2019-05-06 23:46:19

标签: scala logging akka akka-typed

我无法在打字演员中设置适当的Logger。

这是我要实现的日志行:

INFO 16:27:50 com.example.Registry /user/client-0(akka://NumberRegistry) - received input 1. 

尝试1

我正在使用slf4j,这是我设法编写的当前最好的设置代码,但这还不够。

private val logger = Logging(context.system.toUntyped, context.self.path.toStringWithoutAddress)

输出:

INFO 16:27:50 /user/client-0(akka://NumberRegistry) - received input 1.

我无法使用slf4j过滤此级别的可加性,因此无法区分系统日志和日志。您无法在logback.xml中命名子路径,例如

<logger name="com.example" level="DEBUG" additivity="false">

尝试2

如果您通过this.getClass作为日志来源:

private val logger = Logging(context.system.toUntyped, this.getClass)

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

尝试3

我尝试通过覆盖LogSourcegenString来创建自定义getClazz

object MyType {
  implicit val logSource: LogSource[AnyRef] = new LogSource[AnyRef] {
    def genString(o: AnyRef): String = o match { 
      case o: ActorRef[_] => o.path.path.toStringWithoutAddress
      case _ => o.getClass.getName
    }
    override def getClazz(o: AnyRef): Class[_] = o match {
      case _: ActorRef[_] => classOf[akka.event.DummyClassForStringSources]
      case _ => o.getClass
    }
}

但是它不起作用,也不是很好。

我阅读了整个logging documentation,但没有详细介绍akka型。

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

1 个答案:

答案 0 :(得分:1)

如果您使用上下文记录器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