Scala Akka使用SLF4J MDC进行记录

时间:2014-08-05 09:10:05

标签: scala akka slf4j mdc

我正在配置我的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获取这些值

如何以干净的方式实现这一目标?

谢谢!

1 个答案:

答案 0 :(得分:1)

如果演员系统之外的所有代码都是单线程的(即你不会产生任何额外的期货或线程),那么这个解决方案比@jasop引用的解决方案更简单。

我有这个mixin负责在演员内部和外部填充MDC:

com.typesafe.scalalogging.LazyLogging

非演员代码可以使用任何记录器,例如混合call()特征。