【问题标题】:Add global custom values to Play Framework logger将全局自定义值添加到 Play Framework 记录器
【发布时间】:2017-04-12 03:08:25
【问题描述】:

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

MDC.put("role", role)

role 是代表进程主要角色的字符串(如“worker”),所有日志都会有这个额外的上下文值,有助于调查。

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

【问题讨论】:

    标签: scala playframework-2.0 logback


    【解决方案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 处理请求,因此您在 Akka 中拥有的任何“全局”信息都必须提取并添加到 Play 中——为了最大程度的方便,您可以使用操作组合或通过添加将这些信息放入 WrappedRequest过滤器。

    【讨论】:

    • 谢谢!我的理解是底层系统(例如 Akka)编写的日志永远不会有这个标记,对吧?
    • 如果您使用的是 akka.event.Logging,那么标记支持在 2.4.x 中不可用。它应该在 2.5.0 中可用:请参阅 github.com/akka/akka/issues/21671
    猜你喜欢
    • 2015-12-15
    • 1970-01-01
    • 2014-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多