J'ai un acteur Akka qui appelle MyObject.foo (). MyObject n'est pas un acteur. Comment configurer la connexion? Avec un acteur, c'est simple, parce que je peux mélanger ActorLogging. Dans MyObject, je n'ai pas accès à context.system. Est-ce que je crée un akka.event.Logging avec AkkaSystem (), puis quoi pour l'implicite LogSource?
Réponses
Trop de publicités?En fait je voudrais rediriger Akka journalisation de slf4j et de l'utilisation de cette API directement dans toutes les classes indépendantes. D'abord l'ajouter à votre configuration:
akka {
event-handlers = ["akka.event.slf4j.Slf4jEventHandler"]
loglevel = "DEBUG"
}
Ensuite, choisissez quelques SLF4J mise en œuvre, je vous suggère de logback. Dans votre acteurs de continuer à utiliser ActorLogging
trait. Dans d'autres classes, il suffit de s'appuyer sur SLF4J API - ou mieux encore - essayez slf4s façade autour de SLF4J.
Astuce: essayez d'enregistrement suivantes motif dans Logback:
<pattern>%d{HH:mm:ss.SSS} | %-5level | %thread | %X{akkaSource} | %logger{1} | %m%n%rEx</pattern>
L' %X{akkaSource}
imprime acteur chemin lorsqu'ils sont disponibles (comme la norme de journalisation).
En utilisant Akka 2.2.1, j'ai pu mettre cela dans mon application pour que la journalisation se fasse en dehors d'un acteur:
import akka.event.Logging
val system = ActorSystem("HelloSystem", ConfigFactory.load.getConfig("akka"))
val log = Logging.getLogger(system, this)
log.info("Hi!")
Cela semble être une solution plus simple pour unifier la journalisation d'une application.
J'ai maintenant décidé de simplement passer mon système de journalisation central par injection de constructeur de DI (Guice). Et dans mes cours qui se connectent régulièrement (où l'asynchronicité est importante), je prends le système Actor injecté et appelle le
this.log = akka.event.Logging.getLogger(actorSystem, this);
dans le constructeur de classes.