Scala Akka使用SLF4J MDC进行记录
发布时间:2020-12-16 09:25:36 所属栏目:安全 来源:网络整理
导读:我正在配置我的Akka应用程序以使用此处指定的SLF4J记录器: http://doc.akka.io/docs/akka/2.3.4/scala/logging.html 在引擎盖下,我依靠Logback来进行日志记录.我正在开发一个用于日志记录目的的通用模块,用户可以在他们的actor系统中使用.主要是,我正在创造
我正在配置我的Akka应用程序以使用此处指定的SLF4J记录器:
http://doc.akka.io/docs/akka/2.3.4/scala/logging.html 在引擎盖下,我依靠Logback来进行日志记录.我正在开发一个用于日志记录目的的通用模块,用户可以在他们的actor系统中使用.主要是,我正在创造一个他们可以混合的特质. 我有一个特点,这样做: 我有这样的东西: trait ActorLogger { val log: DiagnosticLoggingAdapter = Logging(this); } 我有一些额外的逻辑,它将MDC值添加到DiagnosticLoggingAdapter的MDC. trait ClassLogger { val log = LoggerFactory getLogger getClass.getName } 我希望MDC值能够延续到此记录器.因此,例如,如果我将MDC值放入我的DiagnosticAdapterLogger,我应该能够从org.slf4j.MDC获取这些值 如何以干净的方式实现这一目标? 谢谢! 解决方法
如果actor系统之外的所有代码都是单线程的(即你没有产生任何额外的期货或线程),那么有一个比@jasop引用更简单的解决方案.
我有这个mixin负责在演员内部和外部填充MDC: import akka.actor.DiagnosticActorLogging import akka.contrib.pattern.ReceivePipeline import org.slf4j.MDC import scala.collection.JavaConverters.mapAsJavaMapConverter trait MdcActorLogging extends DiagnosticActorLogging { this: ReceivePipeline => /** * This is for logging in Akka actors. */ override def mdc(message: Any): akka.event.Logging.MDC = { message match { case MyMessage(requestId) => Map("requestId" -> requestId) case _ => Map() } } /** * This makes the MDC accessible for logging outside of Akka actors by wrapping the actor's * `receive` method. * Implements the [[http://doc.akka.io/docs/akka/2.4/contrib/receive-pipeline.html ReceivePipeline]] * pattern. */ pipelineOuter { case e @ MyMessage(requestId) => val origContext = MDC.getCopyOfContextMap val mdcWithPath = Map("requestId" -> requestId,// inside actors this is already provided,but outside we have to add this manually "akkaSource" -> self.path.toString) MDC.setContextMap(mdcWithPath.asJava) ReceivePipeline.Inner(evt) // invoke actual actor logic .andAfter { if (origContext != null) MDC.setContextMap(origContext) else MDC.clear() } case e => ReceivePipeline.Inner(e) // pass through } } 非演员代码可以使用任何记录器,例如混合com.typesafe.scalalogging.LazyLogging特征. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |