2015-05-07 11 views
5

में लॉग इन करना मैं अपने AKKA एप्लिकेशन पर लॉगबैक एमडीसी लॉगिंग को व्यवस्थित करना और अधिक जानकारीपूर्ण लॉग रखना चाहता हूं; हालांकि, मैंने यह भी पढ़ा है कि एमडीसी एकेकेए के साथ अच्छी तरह से काम नहीं कर सकता है क्योंकि AKKA में एसिंक्रोनस लॉगिंग सिस्टम है (एमडीसी एक अलग थ्रेड पर संग्रहीत किया जा सकता है)। मैंने एमडीसी लॉगिंग के लिए कस्टम डिस्पैचर का इस्तेमाल किया here मेरी समस्या को हल करने की उम्मीद कर रहा है लेकिन मैं इसे अपने आवेदन पर काम नहीं कर सकता। मेरा आवेदन हालांकि एक प्ले फ्रेमवर्क ऐप नहीं है।एमडीसी (मैप किए गए डायग्नोस्टिक संदर्भ) AKKA

मेरे पास RequestHandler अभिनेता है जो विभिन्न प्रकार के अनुरोध प्राप्त करता है और इसे RequestSpecificHandler अभिनेता को सौंपता है जो इसे संसाधित करेगा।

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 
    } 
} 

मेरी RequestSpecificHandler एक्टर्स में, मैं भी नए बनाने या मौजूदा 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 
    }   

} 

लॉगिंग अलग है हर मैं एक अनुरोध भेज अन्य को देखें, कभी कभी यह सही MDC MessageId और requestType साथ लॉग करता है, कभी कभी ऐसा होता है कोई मूल्य नहीं है। यहां तक ​​कि "FIRST LOG Received a RequestA" लॉग इस तरह से व्यवहार करती है, मुझे लगता है यह हमेशा सही logstamp होना चाहिए के रूप में यह एक ही कक्षा मैं कहाँ MDC.put

यहाँ फोन में है मेरी 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" 
    } 
... 

मैं कैसे कर सकते एमडीसी लॉगिंग जहां एक निश्चित अनुरोध के दौरान निष्पादित सभी कोड लॉग (निर्भरता lib लॉग सहित) में एक ही संदेश होगा, अनुरोध, टाइपस्टैम्प टाइप करें? क्या AKKA के लिए कस्टम डिस्पैचर से इसे करने के अन्य तरीके हैं? साथ ही, MDC.put और MDC.remove कोड घोषित करने के लिए एक और अधिक व्यवस्थित तरीका क्या है? अभी मैं इसे प्राप्त करने पर प्रत्येक मामले पर कर रहा हूँ।

धन्यवाद

+0

मैंने http://stackoverflow.com/a/39320938/843660 – dskrvk

उत्तर

1

akka.actor.DiagnosticActorLogging आपकी समस्या का समाधान करना चाहिए सकता है।

+0

में इसका समाधान विस्तृत किया है यह केवल अभिनेताओं के भीतर काम करता है। एमडीसी को अन्य लॉगर्स (जिसे संदर्भित पोस्ट के बारे में है) को प्रचारित करने के लिए कुछ अतिरिक्त काम की आवश्यकता है। – dskrvk

संबंधित मुद्दे