scala – MDC(映射诊断上下文)登录AKKA
我想在我的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”日志也是这样的,我认为它应该始终具有正确的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" } ... 如何执行MDC日志记录,在某个请求期间执行的所有代码日志(包括依赖项lib日志)将具有相同的messageId,requestType logstamp?除了AKKA的Custom Dispatcher之外,还有其他方法吗?另外,什么是更加组织的方式来声明MDC.put和MDC.remove代码?现在我收到了每个案件. 谢谢 解决方法
akka.actor.DiagnosticActorLogging可能应该解决您的问题.
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |