MDC(映射的诊断上下文)登录AKKA

Fra*_*ith 5 logging scala mdc akka

我想在我的AKKA应用程序上实现logback MDC日志记录,以组织并拥有更具信息性的日志; 但是,我还读到MDC可能不适用于AKKA,因为AKKA具有异步日志记录系统(MDC可能存储在不同的线程上).我使用的自定义调度的定义MDC记录在这里希望能解决我的问题,但我不能让我的应用程序.我的应用程序不是一个游戏框架应用程序.

我有一个RequestHandler接收不同类型请求的RequestSpecificHandlerActor,并将其委托给将处理它的Actor.

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
    }
}
Run Code Online (Sandbox Code Playgroud)

在我的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
    }        

} 
Run Code Online (Sandbox Code Playgroud)

每次发送请求时记录都不同,有时它使用正确的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"
    }
...
Run Code Online (Sandbox Code Playgroud)

如何执行MDC日志记录,在某个请求期间执行的所有代码日志(包括依赖项lib日志)将具有相同的messageId,requestType logstamp?除了AKKA的Custom Dispatcher之外,还有其他方法吗?另外,什么是更加组织的声明MDC.putMDC.remove编码方式?现在我收到了每个案件.

谢谢

Key*_*ash 1

akka.actor.DiagnosticActorLogging 可能应该可以解决您的问题。