Scala 添加全局自定义值以播放框架记录器

Scala 添加全局自定义值以播放框架记录器,scala,playframework-2.0,logback,Scala,Playframework 2.0,Logback,我有一组不同的Akka演员,都使用logback作为记录器。在纯Akka actors启动中,我可以在应用程序初始化期间执行以下操作: MDC.put("role", role) 角色是表示流程主角色(如“worker”)的字符串,所有日志都将具有此附加上下文值,有助于调查 其中一个角色是前端,并使用Play框架发布REST API。在这种情况下,我没有定义对象扩展应用程序,我也不知道如何/在何处设置这样的全局值,以便在play应用程序中发出的所有日志都标记有角色(以及我想放置的其他内容)。p

我有一组不同的Akka演员,都使用logback作为记录器。在纯Akka actors启动中,我可以在应用程序初始化期间执行以下操作:

MDC.put("role", role)
角色是表示流程主角色(如“worker”)的字符串,所有日志都将具有此附加上下文值,有助于调查


其中一个角色是前端,并使用Play框架发布REST API。在这种情况下,我没有定义对象扩展应用程序,我也不知道如何/在何处设置这样的全局值,以便在play应用程序中发出的所有日志都标记有角色(以及我想放置的其他内容)。

play是一个多线程应用程序,因此在此处使用MDC无法有效工作。您可以做的最好的事情是使用SLF4J标记API,它可以在线程之间传递

Play 2.6.x将支持,但同时您应该直接使用SLF4J来利用创建包含您的角色和其他信息的丰富标记

import static net.logstash.logback.marker.Markers.*

Marker logstashMarker = append("name", "value");
private val logger = org.slf4j.LoggerFactory.getLogger(this.getClass)
logger.debug(logstashMarker, "My message")
然后可以将logstashMarker作为隐式参数传递给方法,而不必担心线程本地信息


请注意,Play处理请求,因此必须提取并添加您在Akka中想要在游戏中使用的任何“全局”信息——为了最大的方便,您可以使用动作合成或添加过滤器将这些信息放入WrappedRequest中。

谢谢!我的理解是,由下面的系统(例如Akka)编写的日志永远不会有这个标记,对吗?如果您使用的是Akka.event.Logging,那么标记支持在2.4.x中不可用。应在2.5.0中提供:请参阅