2015-05-07 13 views
5

AKKA uygulamamda günlüğe kaydetme MDC günlüğünü düzenlemek ve daha çok bilgi içeren bir günlüğe sahip olmak istiyorum; bununla birlikte, MDK'nın AKKA ile uyumsuz olabileceğini de okudum, çünkü AKKA'nın asenkron kayıt sistemi var (MDC, farklı bir iş parçacığında saklanabilir). Sorunumun çözülmesini umarak MDC Logging tanımlı here için Özel Dispatcher'ı kullandım ancak uygulamada çalışamıyorum. Uygulamam yine de bir oyun çerçevesi uygulaması değil.MDC (Mapped Diagnostic Context) AKKA'da günlüğe kaydetme

Farklı türde bir istek alan ve onu işleyecek olan RequestSpecificHandler Aktörüne aktaran RequestHandler Aktörüm var. Benim RequestSpecificHandler Aktörler ise

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

, ben de yeni oluşturmak veya 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 
    }   

} 

Günlüğü ben bir istek göndermek her şey farklıdır mevcut diğer bakın bazen bazen öyle doğru MDC MessageID ve requestType içeren günlükler herhangi bir değeri yok. Yapabileceğim nasıl

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

: Hatta "FIRST LOG Received a RequestA" günlük bu şekilde davranır, bunu ben burada MDC.put

diyoruz aynı sınıfta olduğu gibi her zaman doğru logstamp olmalıdır varsayalım benim dosyasına koyarak olduğunu Belli bir istek sırasında yürütülen tüm kod günlüklerinin (bağımlılık lib günlükleri dahil) MDC günlüğe kaydedilmesiyle aynı messageId, requestType logstamp olacak mı? Bunu, AKKA için Özel Dispatcher'dan yapmanın başka yolları var mı? Ayrıca, MDC.put ve MDC.remove kodlarını bildirmenin daha organize bir yolu nedir? Şu an aldığım her davada yaşıyorum.

Teşekkür

+0

Buna http://stackoverflow.com/a/39320938/843660 – dskrvk

cevap

1

akka.actor.DiagnosticActorLogging sorunu çözmek gerekir olabilir.

+0

adresinden bir çözüm ekledim. Bu yalnızca aktörler içinde çalışır. MDC'yi diğer kaydedicilere (başvurulan gönderi hakkında) yaymak için bazı ek çalışmalara ihtiyaç vardır. – dskrvk

İlgili konular