AKKA中的MDC(映射诊断上下文)日志记录

6
我想在我的AKKA应用程序中实现logback MDC日志记录,以便组织并获得更多信息的日志;然而,我也读到MDC可能与AKKA不兼容,因为AKKA有异步日志系统(MDC可能存储在不同的线程上)。我使用了此处定义的自定义分发器进行MDC日志记录,希望解决我的问题,但我无法使其在我的应用程序中工作。虽然我的应用程序不是Play框架应用程序,但我有一个RequestHandler Actor,它接收不同类型的请求并将其委托给RequestSpecificHandler 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
    }
}

在我的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"这个日志也是如此,我认为它应该总是有正确的日志时间戳,因为它是在我调用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"
    }
...

我该如何进行MDC日志记录,使某个请求期间执行的所有代码日志(包括依赖库日志)具有相同的messageId、requestType logstamp?除了AKKA自定义调度程序之外,是否还有其他方法可以实现这一点?此外,声明MDC.putMDC.remove代码的更有组织的方式是什么?目前,我在每个接收案例中都有这些代码。
谢谢。

我在https://dev59.com/NILba4cB1Zd3GeqPbC8m#39320938中详细说明了解决方案。 - dskrvk
1个回答

1

akka.actor.DiagnosticActorLogging可能会解决您的问题。


这只在actor内部起作用。要将MDC传播到其他记录器(关于引用帖子的内容),需要进行一些额外的工作。 - dskrvk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接