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
Buna http://stackoverflow.com/a/39320938/843660 – dskrvk