Akka Protokollierung außerhalb Schauspieler
Ich habe eine Akka Schauspieler, die einen Aufruf zu MyObject.foo()
. MyObject
ist kein Schauspieler. Wie richte ich die Protokollierung in it? Mit dem Schauspieler ist es einfach, da kann ich nur mixin ActorLogging. In MyObject, ich habe keinen Zugriff zum Kontext.system. Erstelle ich eine akka.event.Logging
mit AkkaSystem() und dann was für die LogSource implizite?
- Haben Sie dies gelesen habe? : doc.akka.io/docs/akka/2.0/scala/logging.html
- yep. Es scheint nicht für meine Frage, obwohl, noch ist es zu beschreiben, warum der Akka Ereignis-logger müssen (im Gegensatz zu nur mit SLF4J direkt in die Schauspieler).
- Denn Sie können jede logging-backend asynchron, da die Anmeldung erfolgt über Schauspieler.
- warum würden Sie nicht einfach umsetzen, die SLF4J-API mit einem Akka async delegieren backend? Stattdessen werden die Akka-logging-API ist komisches Zeug wie die Umkehrung der Reihenfolge von exception und die Nachricht, und unterstützt keine Ausnahmen für log.Warnung.
- Hätte nicht geholfen, jemand anderes würde sich beschweren, wir haben nicht die Verwendung der Java-Logging-API (jemand schon).
Du musst angemeldet sein, um einen Kommentar abzugeben.
Eigentlich würde ich redirect Akka-Protokollierung slf4j, und verwenden Sie diese API direkt in alle nicht verwandten Klassen. Zuerst fügen Sie diese auf Ihre Konfiguration:
Dann wählen Sie einige SLF4J implementation, schlage ich vor, logback. In Ihre Akteure weiterhin mit
ActorLogging
Merkmal. In anderen Klassen verlassen sich einfach auf die SLF4J-API - oder noch besser - probieren Sie slf4s Fassade um SLF4J.Tipp: probieren Sie die folgenden Protokoll-Muster in Logback:
Den
%X{akkaSource}
gedruckt Schauspieler Weg, wenn verfügbar (genau wie standard-logging).application.conf
die event-Handler-Zeile, wie beschrieben, in meinem Fall"MyObject"
instanziiert wird mit der Reflexion und des inneren logger erstellt durch aufrufenorg.slf4j.LoggerFactory.getLogger(getClass.getName)
, und doch sind alle, die Schlüssel legte ich in die MDC, alle %X Orte sind leer,/: könnte jemand bitte teilen Sie einen Goldenen Rat?Verwendung von Akka 2.2.1, konnte ich diese in meiner App, um die Protokollierung außerhalb eines Schauspielers:
Diese scheint eine einfachere Lösung für die Vereinheitlichung einer Anwendung protokollieren.
Wie bereits erwähnt, hat man die Qual der Optionen für nicht-Schauspieler Protokollierung innerhalb einer Akteur-system. Ich werde versuchen, eine Reihe von Heuristiken, um zu helfen Sie bestimmen, wie Sie sollten, route Protokollierung für Ihre Arbeit.
Du bist willkommen, zu mischen und anzupassen, die oben genannten Verhaltensweisen als notwendig, um Ihre Anforderungen zu erfüllen. Beispielsweise könnten Sie wählen zu binden, SLF4J, die für Bibliotheken und die Verwendung von Akka logging für alles andere. Nur beachten Sie, dass das mischen blockierende und nicht-blockierende Protokollierung verursachen könnte, Wettlaufsituationen, in denen Ursachen (angemeldet async über die Schauspieler) werden protokolliert, nach deren Wirkungen (angemeldet sync direkt).
Habe ich nun erledigt, einfach nur vorbei mein zentrales logging-system, um durch DI constructor injection (Guice). Und in meine Klassen, die Protokollierung regelmäßig (wo Asynchronität ist wichtig), ich nehme die injiziert ActorSystem, und rufen Sie die
in der Klassen-Konstruktor.
( implicit log:LoggingAdapter )
Methoden, die tun müssen, um die Protokollierung.erstellen Sie einfach Ihre eigenen logger: