如何引用嵌套的 Scala 对象以在 logback.groovy 上动态设置配置?
How to reference a nested scala object to dynamically set configs on logback.groovy?
我使用 typesafe config 库来管理我的 Scala 项目的配置。我使用以下模式以类型安全的方式组织和加载我的配置
object AppConfig {
private val config = ConfigFactory.load()
lazy val host: String = config.getString("host")
object Splunk {
private lazy val splunkConf = config.getConfig("splunk")
lazy val index = splunkConf.getString("index")
lazy val token = splunkConf.getString("token")
}
}
我需要在 logback.groovy 中注入其中一些配置。这在访问 AppConfig 的直接属性时非常有效:示例 AppConfig.host()
,但不适用于 nested 对象:如 AppConfig.Splunk.token()
logback.groovy
appender("splunk", HttpEventCollectorLogbackAppender) {
url = "http://someSplunkUrl:8088/services/collector"
host = AppConfig.host()
token = AppConfig.Splunk.token()
index = AppConfig.Splunk.index()
batch_size_count = 1
layout(PatternLayout) {
pattern = "%msg"
}
}
groovy.lang.MissingPropertyException: No such property: Splunk for class: AppConfig
at groovy.lang.MetaClassImpl.invokeStaticMissingProperty(MetaClassImpl.java:1028)
at groovy.lang.MetaClassImpl.getProperty(MetaClassImpl.java:1932)
at groovy.lang.MetaClassImpl.getProperty(MetaClassImpl.java:1908)
at groovy.lang.MetaClassImpl.getProperty(MetaClassImpl.java:3886)
at org.codehaus.groovy.runtime.callsite.ClassMetaClassGetPropertySite.getProperty(ClassMetaClassGetPropertySite.java:50)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callGetProperty(AbstractCallSite.java:298)
at Script1$_run_closure2.doCall(Script1.groovy:18)
at Script1$_run_closure2.doCall(Script1.groovy)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
我最终引用了如下嵌套对象:
def splunkConf = Class.forName("com.util.AppConfig$Splunk$")
.getDeclaredConstructor().newInstance()
然后我可以成功访问这些字段:
token = splunkConf."token"()
index = splunkConf."index"()
我使用 typesafe config 库来管理我的 Scala 项目的配置。我使用以下模式以类型安全的方式组织和加载我的配置
object AppConfig {
private val config = ConfigFactory.load()
lazy val host: String = config.getString("host")
object Splunk {
private lazy val splunkConf = config.getConfig("splunk")
lazy val index = splunkConf.getString("index")
lazy val token = splunkConf.getString("token")
}
}
我需要在 logback.groovy 中注入其中一些配置。这在访问 AppConfig 的直接属性时非常有效:示例 AppConfig.host()
,但不适用于 nested 对象:如 AppConfig.Splunk.token()
logback.groovy
appender("splunk", HttpEventCollectorLogbackAppender) {
url = "http://someSplunkUrl:8088/services/collector"
host = AppConfig.host()
token = AppConfig.Splunk.token()
index = AppConfig.Splunk.index()
batch_size_count = 1
layout(PatternLayout) {
pattern = "%msg"
}
}
groovy.lang.MissingPropertyException: No such property: Splunk for class: AppConfig
at groovy.lang.MetaClassImpl.invokeStaticMissingProperty(MetaClassImpl.java:1028)
at groovy.lang.MetaClassImpl.getProperty(MetaClassImpl.java:1932)
at groovy.lang.MetaClassImpl.getProperty(MetaClassImpl.java:1908)
at groovy.lang.MetaClassImpl.getProperty(MetaClassImpl.java:3886)
at org.codehaus.groovy.runtime.callsite.ClassMetaClassGetPropertySite.getProperty(ClassMetaClassGetPropertySite.java:50)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callGetProperty(AbstractCallSite.java:298)
at Script1$_run_closure2.doCall(Script1.groovy:18)
at Script1$_run_closure2.doCall(Script1.groovy)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
我最终引用了如下嵌套对象:
def splunkConf = Class.forName("com.util.AppConfig$Splunk$")
.getDeclaredConstructor().newInstance()
然后我可以成功访问这些字段:
token = splunkConf."token"()
index = splunkConf."index"()