Play框架需要(默认情况下)通过logback.xml文件配置日志记录。我想通过代码构建我的日志追加器,这样我就可以在运行时获取参数(例如,日志的graylog目的地是从部署环境中获取的,而不是通过XML文件静态地烘焙它)。
这种事情在Java中很容易实现(通过覆盖日志工厂等),我想知道在Play中是否可以实现相同的功能。
答案 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>