将全局自定义值添加到Play Framework记录器

时间:2017-03-23 09:50:05

标签: scala playframework-2.0 logback

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

MDC.put("role", role)

role是一个表示进程主角色的字符串(例如" worker"),所有日志都有这些额外的上下文值,有助于调查。

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

1 个答案:

答案 0 :(得分:1)

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

Play 2.6.x将支持the Marker API directly,但与此同时,您应该直接使用SLF4J来利用Logstash Logback Encoder创建包含您的角色和其他信息的丰富标记。

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会处理请求,因此任何" global"您必须在Play中提取和添加您在Akka中所需的信息 - 为方便起见,您可以使用动作合成或添加过滤器将该信息放入WrappedRequest中。