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?
En fait, je redirigerais la journalisation Akka vers slf4j et utiliserais cette API directement dans toutes les classes non liées. Ajoutez d'abord ceci à votre configuration:
akka {
event-handlers = ["akka.event.slf4j.Slf4jEventHandler"]
loglevel = "DEBUG"
}
Ensuite, choisissez une implémentation de SLF4J, je suggère logback . Dans vos acteurs, continuez à utiliser le trait ActorLogging
. Dans d'autres classes, vous utilisez simplement l'API SLF4J - ou même mieux - essayez slf4s façade autour de SLF4J.
Conseil: essayez le modèle de journalisation suivant dans Logback:
<pattern>%d{HH:mm:ss.SSS} | %-5level | %thread | %X{akkaSource} | %logger{1} | %m%n%rEx</pattern>
Le %X{akkaSource}
imprimera le chemin de l'acteur lorsqu'il sera disponible (tout comme la journalisation standard).
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.
Comme cela a été mentionné, vous avez l'embarras du choix pour la journalisation sans acteur dans un système d'acteur. Je vais essayer de vous fournir un ensemble d'heuristiques pour vous aider à déterminer la route à suivre pour la journalisation de votre travail.
Nous vous invitons à associer les comportements ci-dessus pour répondre à vos besoins. Par exemple, vous pouvez choisir de vous connecter à SLF4J pour les bibliothèques et d'utiliser la journalisation Akka pour tout le reste. Il suffit de noter que le fait de combiner l'enregistrement avec blocage et l'enregistrement sans blocage peut provoquer des conditions de concurrence fâcheuses où les causes (enregistrées de manière asynchrone via un acteur) sont enregistrées après leurs effets (synchronisées directement avec les utilisateurs enregistrés).
créez simplement votre propre enregistreur:
private val log = LoggerFactory.getLogger(YourClass.getClass)