2015-05-07 12 views
5

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

+0

Podałem szczegółowe rozwiązanie tego problemu na http://stackoverflow.com/a/39320938/843660 – dskrvk

Odpowiedz

1

akka.actor.DiagnosticActorLogging może powinno rozwiązać problem.

+0

Działa to tylko w przypadku aktorów. Aby propagować MDC do innych rejestratorów (o których mowa w odnośnym poście), potrzebna jest dodatkowa praca. – dskrvk