在 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>
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>