Как настроить регистрацию в akka-type так, чтобы пути к действующим субъектам правильно отображались? - PullRequest
0 голосов
/ 07 мая 2019

Я не могу настроить правильный 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 как logSource:

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

вы просто получите набор akka.actor.typed.internal.adapter.ActorSystemAdapter в качестве имени логгера в логах.

попробуй 3

Я попытался создать пользовательский LogSource, переопределив genString и 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
    }
}

но это не работает и тоже нехорошо.

Я прочитал всю документацию по ведению журнала , но в ней нет подробной информации, набранной в виде акки.

Как настроить регистратор, в котором правильно указаны имя класса и путь актера в типизированном актере?

1 Ответ

1 голос
/ 15 мая 2019

Если вы используете регистратор контекста 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
...