HiC*_*123 6 scala slf4j mdc akka
我正在配置我的Akka应用程序以使用此处指定的SLF4J记录器:
http://doc.akka.io/docs/akka/2.3.4/scala/logging.html
在引擎盖下,我依靠Logback进行日志记录.我正在开发一个用于日志记录目的的通用模块,用户可以在他们的actor系统中使用.主要是,我正在创造一个他们可以混合的特质.
我有一个特点,这样做:
我有这样的东西:
trait ActorLogger {
val log: DiagnosticLoggingAdapter = Logging(this);
}
Run Code Online (Sandbox Code Playgroud)
我有一些额外的逻辑,它将MDC值添加到DiagnosticLoggingAdapter的MDC.现在的问题是:如果用户想要混合到非演员类,我会完全暴露一个不同的记录器.所以我可能有这样的事情:
trait ClassLogger {
val log = LoggerFactory getLogger getClass.getName
}
Run Code Online (Sandbox Code Playgroud)
我希望MDC值能够延续到此记录器.因此,例如,如果我将MDC值放入我的DiagnosticAdapterLogger,我应该能够从org.slf4j.MDC获取这些值
如何以干净的方式实现这一目标?
谢谢!
如果 actor 系统之外的所有代码都是单线程的(即您不生成任何额外的 future 或线程),那么有一个比 @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
}
}
Run Code Online (Sandbox Code Playgroud)
非参与者代码可以使用任何记录器,例如混合特征com.typesafe.scalalogging.LazyLogging。
| 归档时间: |
|
| 查看次数: |
2229 次 |
| 最近记录: |