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



我有一个不同的Akka参与者集群,都使用logback作为记录器。在纯 Akka actor 启动中,我可以在应用程序初始化期间执行此操作:

MDC.put("role", role)

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

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

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

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

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 中想要在 Play 中使用的任何"全局"信息都必须提取并添加 - 为了获得最大的便利,您可以使用操作组合或添加过滤器将该信息放入包装请求中。

最新更新