在 Scala/Play 中以编程方式配置日志记录

Configure logging programmatically in Scala/Play

Play 框架要求(默认情况下)您通过 logback.xml 文件配置日志记录。我想通过代码构建我的日志附加程序,以便我可以在运行时获取参数(例如,日志的 graylog 目标是从部署环境中获取的,而不是通过 XML 文件静态地烘焙它)。

这种事情在 Java 中很容易实现(通过覆盖日志工厂等),我想知道在 Play 中是否也可以实现。

是的,您可以通过编程方式配置 logback,请参阅:https://akhikhl.wordpress.com/2013/07/11/programmatic-configuration-of-slf4jlogback/

但我不推荐它。对于初学者来说,这是一个冗长的 API,使用起来并不愉快。除此之外,声明性的配置通常很好(即使在这种情况下它在 XML 中)。

对于您的用例,Logback 的 XML 确实支持可以来自系统属性或环境变量的变量:https://logback.qos.ch/manual/configuration.html#definingProps

但是,您可能需要跨环境的不同配置(本地没有 greylog)。我认为许多项目通过在启动时将 logback XML 位置指定为系统 属性 来做到这一点:https://logback.qos.ch/manual/configuration.html#configFileProperty

或者,我怀疑 greylog 有某种监视文件的方法来提取您的日志记录。这就是我们在我的团队中收集 Splunk 日志的工作。当有人重新配置 Splunk/Greylog.

时,我们不想更改我们的代码

我最后使用的解决方案是使用一个 logback contextlistener 来填充从环境中提取的参数的上下文。监听器可以如下添加到 logback.xml:

<contextListener class="LoggerStartup"/>

然后 LoggerStartup 可以填充上下文,这是我通过 AWS SSM 实现的(请参阅下面的简化代码)。

class LoggerStartup extends ContextAwareBase with LoggerContextListener with LifeCycle {
    override def start() = {
      val context = getContext()
      val graylogUrl = ... // Go get value from remote store
      context.putProperty("GRAYLOG_URL", graylogUrl)
    }
}

然后在 logback 文件中引用这个上下文变量:

<appender name="GELF UDP APPENDER" class="me.moocar.logbackgelf.GelfUDPAppender">
  <remoteHost>${GRAYLOG_URL}</remoteHost>
  ...
</appender>