Chcę zaimplementować logowanie loginu MDC na mojej aplikacji AKKA w celu zorganizowania i posiadania bardziej infomatywnego dziennika; jednak przeczytałem również, że MDC może nie działać dobrze z AKKA, ponieważ AKKA ma system asynchronicznego rejestrowania (MDC może być przechowywany w innym wątku). Użyłem Custom Dispatchera do logowania MDC zdefiniowanego jako here mając nadzieję na rozwiązanie mojego problemu, ale nie mogę sprawić, by działał on na mojej aplikacji. Moja aplikacja nie jest jednak aplikacją ramową gry.MDC (odwzorowany kontekst diagnostyczny) Logowanie w AKKA
Mam aktor, który otrzymuje różne typy wniosków i przekazuje je aktorowi, który go przetworzy.
class RequestHandler() extends Actor with akka.actor.ActorLogging {
def receive: Receive = {
//Requests
case req: RequestA =>
org.slf4j.MDC.put("messageId", req.msgId)
org.slf4j.MDC.put("requestType", req.requestType)
log.debug("FIRST LOG Received a RequestA")
val actorA = context.ActorOf(ActorA.props)
actorA ! req.msg
case req: RequestB => //...
//other requests...
//Response
case res: ResponseA =>
log.debug("Received responseA")
org.slf4j.MDC.remove("messageId")
org.slf4j.MDC.remove("requestType")
//other response
}
}
W moich RequestSpecificHandler
Aktorzy, ja też utworzyć nowy lub odnoszą się do innych istniejących HelperActors
class ActorA() extends Actor with akka.actor.ActorLogging {
val helperA = context.actorSelection("/user/helperA")
val helperB = context.actorOf("HelperB.props")
def receive: Receive = {
case msg: MessageTypeA =>
//do some stuff
log.debug("received MessageTypeA")
helperA ! taskForA
case doneByA =>
//do some stuff
log.debug("received doneByA")
helperB ! taskForB
case doneByB =>
log.debug("send reponseA")
sender ! ResponseA
}
}
Logging różni się za każdym razem wysłać żądanie, czasami loguje z prawidłowym MDC komunikatu i RequestType, czasami to robi nie ma żadnej wartości. Nawet dziennik "FIRST LOG Received a RequestA"
zachowuje się w ten sposób, zakładam powinien zawsze mieć prawidłową logstamp jak to jest w tej samej klasie, gdzie ja nazywam MDC.put
Tu jest mój application.conf:
akka {
log-dead-letters = 10
loggers = ["akka.event.slf4j.Slf4jLogger"]
loglevel = DEBUG
logging-filter = "akka.event.slf4j.Slf4jLoggingFilter"
actor{
default-dispatcher {
type = "some.package.monitoring.MDCPropagatingDispatcherConfigurator"
}
...
Jak mogę zrobić Rejestrowanie MDC, w którym wszystkie dzienniki kodu (w tym dzienniki zależności zależności) wykonywane podczas określonego żądania będą miały ten sam identyfikator messageId, dziennik zleceń typu requestType? Czy istnieją inne sposoby, aby to zrobić poza Custom Dispatcher dla AKKA? Ponadto, czym jest bardziej uporządkowany sposób deklarowania kodów MDC.put
i MDC.remove
? Teraz mam to na każdym przypadku po otrzymaniu.
Dzięki
Podałem szczegółowe rozwiązanie tego problemu na http://stackoverflow.com/a/39320938/843660 – dskrvk