将全局自定义值添加到 Play Framework 记录器
Add global custom values to Play Framework logger
我有一组不同的 Akka 演员,都使用 logback 作为记录器。在纯 Akka actors 启动中,我可以在应用程序初始化期间执行此操作:
MDC.put("role", role)
role 是表示进程主要角色的字符串(如 "worker"),所有日志都将具有此附加上下文值,有助于调查。
其中一个角色是前端,使用 Play 框架发布 REST API。在那种情况下,我没有定义扩展 App 的对象,并且我不知道 how/where 设置这样的全局值,以便播放应用程序中发出的所有日志都标有角色(以及我的其他附加内容)想放)。
Play 是一个多线程应用程序,因此在这里使用 MDC 不会有效地工作。您可以做的最好的事情是使用 SLF4J 标记 API,它可以在线程之间传递。
Play 2.6.x 将支持 the Marker API directly, but in the mean time you should use SLF4J directly to leverage the 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 会处理请求,因此您在 Akka 中拥有的任何您想要在 Play 中使用的 "global" 信息都必须被提取和添加——为了最大限度地方便,您可以使用 action 将该信息放入 WrappedRequest 中组合或添加过滤器。
我有一组不同的 Akka 演员,都使用 logback 作为记录器。在纯 Akka actors 启动中,我可以在应用程序初始化期间执行此操作:
MDC.put("role", role)
role 是表示进程主要角色的字符串(如 "worker"),所有日志都将具有此附加上下文值,有助于调查。
其中一个角色是前端,使用 Play 框架发布 REST API。在那种情况下,我没有定义扩展 App 的对象,并且我不知道 how/where 设置这样的全局值,以便播放应用程序中发出的所有日志都标有角色(以及我的其他附加内容)想放)。
Play 是一个多线程应用程序,因此在这里使用 MDC 不会有效地工作。您可以做的最好的事情是使用 SLF4J 标记 API,它可以在线程之间传递。
Play 2.6.x 将支持 the Marker API directly, but in the mean time you should use SLF4J directly to leverage the 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 会处理请求,因此您在 Akka 中拥有的任何您想要在 Play 中使用的 "global" 信息都必须被提取和添加——为了最大限度地方便,您可以使用 action 将该信息放入 WrappedRequest 中组合或添加过滤器。