Scala 如何从typesafe配置配置配置系统属性或logback配置变量?

Scala 如何从typesafe配置配置配置系统属性或logback配置变量?,scala,configuration,akka,logback,typesafe-stack,Scala,Configuration,Akka,Logback,Typesafe Stack,在我的logback.xml配置文件中有默认值的变量,我希望能够从我的typesafe configapplication.conf文件中选择设置这些变量 我使用一个jar部署应用程序,可部署jar中打包的application.conf文件包含默认值。我在执行时传递-Dconfig.file=foo.conf,以提供特定于服务器的配置文件的路径 现在,我还可以传递-Dlog.level和其他变量来覆盖logback.xml中的默认值,并且我还必须在命令行上传递-Dfile.encoding=U

在我的
logback.xml
配置文件中有默认值的变量,我希望能够从我的typesafe config
application.conf
文件中选择设置这些变量

我使用一个jar部署应用程序,可部署jar中打包的
application.conf
文件包含默认值。我在执行时传递
-Dconfig.file=foo.conf
,以提供特定于服务器的配置文件的路径

现在,我还可以传递
-Dlog.level
和其他变量来覆盖
logback.xml
中的默认值,并且我还必须在命令行上传递
-Dfile.encoding=UTF-8
。我正在寻找一种能够在typesafe配置中而不是在命令行中指定这些属性的方法。感觉应该有办法做到这一点,但我找不到神奇的词语

logback.xml:

<configuration>
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${log.path:-logs/}/${log.file:-myLog.log}</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- daily rollover -->
            <fileNamePattern>logFile.%d{yyyy-MM-dd}.log</fileNamePattern>

            <!-- keep 15 days' worth of history -->
            <maxHistory>${log.history.days:-15}</maxHistory>
        </rollingPolicy>

        <encoder>
            <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
        </encoder>
    </appender>

    <root level="${log.level:-INFO}">
        <appender-ref ref="FILE" />
    </root>
</configuration>
akka {
    log-config-on-start = false
    event-handlers = ["akka.event.slf4j.Slf4jEventHandler"]
}
include "/application.conf"

akka.log-config-on-start = true

log.level = WARN // this is what I'd LIKE to be able to do
java -Dfile.encoding=UTF-8 -Dconfig.file=myApp.conf -Dlog.level=WARN -jar myApp_2.10-0.1-one-jar.jar 
特定于服务器的app.conf示例:

<configuration>
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${log.path:-logs/}/${log.file:-myLog.log}</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- daily rollover -->
            <fileNamePattern>logFile.%d{yyyy-MM-dd}.log</fileNamePattern>

            <!-- keep 15 days' worth of history -->
            <maxHistory>${log.history.days:-15}</maxHistory>
        </rollingPolicy>

        <encoder>
            <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
        </encoder>
    </appender>

    <root level="${log.level:-INFO}">
        <appender-ref ref="FILE" />
    </root>
</configuration>
akka {
    log-config-on-start = false
    event-handlers = ["akka.event.slf4j.Slf4jEventHandler"]
}
include "/application.conf"

akka.log-config-on-start = true

log.level = WARN // this is what I'd LIKE to be able to do
java -Dfile.encoding=UTF-8 -Dconfig.file=myApp.conf -Dlog.level=WARN -jar myApp_2.10-0.1-one-jar.jar 
我当前运行应用程序的方式:

<configuration>
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${log.path:-logs/}/${log.file:-myLog.log}</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- daily rollover -->
            <fileNamePattern>logFile.%d{yyyy-MM-dd}.log</fileNamePattern>

            <!-- keep 15 days' worth of history -->
            <maxHistory>${log.history.days:-15}</maxHistory>
        </rollingPolicy>

        <encoder>
            <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
        </encoder>
    </appender>

    <root level="${log.level:-INFO}">
        <appender-ref ref="FILE" />
    </root>
</configuration>
akka {
    log-config-on-start = false
    event-handlers = ["akka.event.slf4j.Slf4jEventHandler"]
}
include "/application.conf"

akka.log-config-on-start = true

log.level = WARN // this is what I'd LIKE to be able to do
java -Dfile.encoding=UTF-8 -Dconfig.file=myApp.conf -Dlog.level=WARN -jar myApp_2.10-0.1-one-jar.jar 

我不熟悉Logback,但是一个普通的Akka应用程序在其
reference.conf
中附带了默认设置,您可以在
application.conf
中覆盖这些设置。听起来您想添加第三层配置,这当然是您的权利

我能看到的最简单的方法是将
application.conf
更改为包含
foo.conf
,而不是相反。这样,Akka将加载
application.conf
,然后加载
foo.conf

但是,如果您需要为每个JAR发行版使用不同名称的conf文件,那么这可能不起作用。在这种情况下,我建议您研究如何以编程方式加载和组合配置。实际上,在Akka配置文档中,除了希望从类路径资源加载
myConfig
,而不是通过解析字符串(请参阅Typesafe配置文档以了解如何操作)之外,几乎完全符合您的要求


关于Logback配置,就像我说的,我不知道Logback。但是您可以从Typesafe配置中读取值,并且可以设置Logback根日志记录器级别。

我选择通过编程方式配置Logback的Typesafe配置。结果很容易

def enableRemoteLogging(config: Config) = {
    val ctx = LoggerFactory.getILoggerFactory.asInstanceOf[LoggerContext]

    val gelf = new GelfAppender
    gelf.setGraylog2ServerHost(config.getString("logging.remote.server"))
    gelf.setUseLoggerName(true)
    gelf.setUseThreadName(true)
    gelf.setUseMarker(true)
    gelf.setIncludeFullMDC(true)
    gelf.setContext(ctx)
    gelf.start()

    LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME)
      .asInstanceOf[ch.qos.logback.classic.Logger]
      .addAppender(gelf)
  }

您可以使用
PropertyDefiner
界面。非平凡的脚手架,但允许您使用XML而不是在应用程序中进行配置。例如:

package com.myapp;
导入ch.qos.logback.core.PropertyDefinerBase;
导入com.typesafe.config.ConfigFactory;
公共类TypesafeConfigPropertyDefiner扩展了PropertyDefinebase{
私有字符串propertyName;
@凌驾
公共字符串getPropertyValue(){
返回ConfigFactory.load().getString(propertyName);
}
公共void setPropertyName(字符串propertyName){
this.propertyName=propertyName;
}
}
然后,在logback.xml文件中:


myapp.logging.loglevel
...

现在,上面的logback.xml文件将从您的类型安全配置文件(例如
application.conf
)中读取
myapp.logging.loglevel

感谢您的回复!我对级联配置选项有很好的处理能力;我不清楚的是如何使用typesafe配置来设置系统属性,即必须使用
-Dsome.variable=value
传入的变量。我想如果我能克服这个障碍,比如说,
-Dfile.encoding
,它可能适用于所有的logback变量绑定。这很简单:只需从Typesafe配置文件中读取值,然后调用
System.setProperty()
。但是,如果属性已经被读取,那么它可能不起作用。系统属性通常最好在命令行上设置。对于运行时配置,最好使用每个框架的标准配置方法。GelfAppender是什么?@AlekseiEgorov,它是用于发送到日志服务器(如Graylog2或Logstash)的实现。请参阅项目了解详细信息这是我在整个网络上找到的唯一一个有效(对我来说)的示例!谢谢