如何配置从类型安全配置系统属性的logback或配置变量?(How can I configure

2019-08-17 04:52发布

我有一个默认的变量在我logback.xml配置文件,并且我希望能够可选地从我的类型安全的配置设置这些变量application.conf文件。

我用部署一个罐子中的应用,以及application.conf在部署JAR打包文件中包含的默认值。 我通过-Dconfig.file=foo.conf上执行的,以提供路径特定于服务器的配置文件。

现在,我也可以通过-Dlog.level和其他变量来覆盖默认我在logback.xml ,我也必须要通过-Dfile.encoding=UTF-8在命令行上。 我正在寻找一种方法能够在类型安全配置,而不是在命令行上指定这些属性。 这感觉就像应该有办法做到这一点,但我不能找到神奇的话。

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>

application.conf(捆绑):

akka {
    log-config-on-start = false
    event-handlers = ["akka.event.slf4j.Slf4jEventHandler"]
}

样品特定于服务器的app.conf:

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 

Answer 1:

我选择了以编程方式配置的logback具有类型安全的配置。 它原来是很容易。

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)
  }


Answer 2:

您可以使用PropertyDefiner接口的logback提供 。 不平凡的脚手架,但允许用户使用XML,而不是你的应用程序中进行配置。 例如:

package com.myapp;

import ch.qos.logback.core.PropertyDefinerBase;
import com.typesafe.config.ConfigFactory;

public class TypesafeConfigPropertyDefiner extends PropertyDefinerBase {

    private String propertyName;

    @Override
    public String getPropertyValue() {
        return ConfigFactory.load().getString( propertyName );
    }

    public void setPropertyName( String propertyName ) {
        this.propertyName = propertyName;
    }
}

然后,在你的logback.xml文件:

<configuration>
    <define name="loglevel" class="com.myapp.TypesafeConfigPropertyDefiner">
        <propertyName>myapp.logging.loglevel</propertyName>
    </define>
    <root level="${loglevel}">
       ...
    </root>
</configuration>

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



Answer 3:

我不熟悉的logback,但一个正常的应用程序阿卡船舶在其默认设置reference.conf ,和你在一个覆盖这些设置application.conf 。 这听起来像您要添加配置的第三层,这肯定是你的权利!

我可以看到最简单的方法是改变你的application.conf ,包括您的foo.conf ,而不是周围的其他方式。 这样,阿卡将加载application.conf ,然后将加载foo.conf

但是,如果你需要为每个JAR分布的不同名称的conf文件,该文件可能无法正常工作。 在这种情况下,我建议你考虑合并配置树以编程方式加载和组合配置。 其实, 从自定义位置,读取配置在阿卡配置文档几乎是你想要什么,除了你将要加载myConfig从classpath中的资源,而不是通过解析字符串(见类型安全配置文档找出如何做到这一点)。

关于配置的logback,就像我说的,我不知道的logback。 但是你可以读出值的类型安全配置,像这样的,你可以设置的logback根记录的水平,像这样 。



文章来源: How can I configure system properties or logback configuration variables from typesafe config?