我有一个默认的变量在我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
我选择了以编程方式配置的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)
}
您可以使用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
)。
我不熟悉的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?