如何引用嵌套的 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"()