【问题标题】:MDC (Mapped Diagnostic Context) Logging in AKKAAKKA 中的 MDC(映射诊断上下文)日志记录
【发布时间】:2015-07-17 10:52:03
【问题描述】:

我想在我的 AKKA 应用程序上实现 logback MDC 日志记录,以组织并获得更多信息日志;但是,我还读到 MDC 可能不适用于 AKKA,因为 AKKA 具有异步日志记录系统(MDC 可能存储在不同的线程上)。我使用定义的自定义调度程序用于 MDC 日志记录 here 希望解决我的问题,但我无法让它在我的应用程序上运行。我的应用程序不是一个播放框架应用程序。

我有一个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 Actors 中,我还创建新的或引用其他现有的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"
    }
...

在某个请求期间执行的所有代码日志(包括依赖库日志)都将具有相同的 messageId、requestType 日志戳时,如何进行 MDC 日志记录?除了 AKKA 的自定义调度程序之外,还有其他方法可以做到这一点吗?另外,声明MDC.putMDC.remove 代码的更有条理的方法是什么?现在我在收到的每个案例上都有它。

谢谢

【问题讨论】:

标签: scala logging akka mdc


【解决方案1】:

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

【讨论】:

  • 这仅适用于演员。要将 MDC 传播到其他记录器(引用的帖子是关于)的,需要做一些额外的工作。
猜你喜欢
  • 2015-09-28
  • 1970-01-01
  • 2013-05-24
  • 1970-01-01
  • 2018-08-10
  • 2014-09-27
  • 1970-01-01
  • 2018-08-13
  • 2019-01-31
相关资源
最近更新 更多