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

在Scala/Play中以编程方式配置日志记录,scala,playframework,configuration,logback,slf4j,Scala,Playframework,Configuration,Logback,Slf4j,Play框架要求(默认情况下)通过logback.xml文件配置日志记录。我希望通过代码构建日志附加器,以便在运行时获取参数(例如,日志的graylog目标是从部署环境中获取的,而不是通过XML文件静态烘焙) 这类事情在Java中很容易实现(通过重写日志工厂等),我想知道在游戏中是否可能实现同样的功能 是的,您可以通过编程方式配置回写,请参阅: 但我不推荐。首先,它是一个冗长的API,使用起来并不愉快。除此之外,配置通常是声明性的(即使在本例中是XML) 对于您的用例,Logback的XML确实

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


这类事情在Java中很容易实现(通过重写日志工厂等),我想知道在游戏中是否可能实现同样的功能

是的,您可以通过编程方式配置回写,请参阅:

但我不推荐。首先,它是一个冗长的API,使用起来并不愉快。除此之外,配置通常是声明性的(即使在本例中是XML)

对于您的用例,Logback的XML确实支持来自系统属性或环境变量的变量:

但是,您可能希望跨环境使用不同的配置(本地没有greylog)。我认为许多项目通过在启动时将logback XML位置指定为系统属性来实现这一点:


或者,我怀疑greylog有某种方法可以通过查看文件来获取日志。这就是我们在Splunk中收集日志的方法。当有人重新配置Splunk/Greylog时,我们不想对代码进行更改。

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

<contextListener class="LoggerStartup"/>
然后在logback文件中引用此上下文变量:

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

${GRAYLOG\u URL}
...

这个答案也适用。但是,对我来说,使用上下文侦听器(我下面的答案)比将URL设置为容器上的环境更方便
<appender name="GELF UDP APPENDER" class="me.moocar.logbackgelf.GelfUDPAppender">
  <remoteHost>${GRAYLOG_URL}</remoteHost>
  ...
</appender>