作为Java EE开发人员,我使用了MDC(映射诊断上下文)方法来处理与请求相关的上下文数据,例如,用于跟踪请求中的许多潜在日志事件的唯一请求令牌.该请求的有效期.
鉴于它依赖于ThreadLocal,很明显这种方法在使用异步技术时会崩溃.
我还处于学习Scala的早期阶段,与此问题更相关的是Akka.我已经阅读了很多论坛帖子,证实了Akka和MDC的不兼容性,但尚未发现一种以某种方式模仿MDC方法的一致策略.
是否最好只是明确地传递这种数据作为在演员之间发送的消息的一部分?它有点脏,但同时兼容无法轻松扩展的能力.
除了直接通过消息之外,还有其他方法可以将上下文传递给Actor吗?此外,在使用Play 2.0 Async块时,有没有人遇到过同样的挑战?
我正在配置我的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获取这些值
如何以干净的方式实现这一目标?
谢谢!