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

时间:2017-11-14 14:22:18

标签: scala playframework configuration logback slf4j

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

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

2 个答案:

答案 0 :(得分:1)

是的,您可以通过编程方式配置回退,请参阅: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时,我们不想对我们的代码进行更改。

答案 1 :(得分:0)

我最后使用的解决方案是使用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>