Ian*_*hon 17 configuration scala logback akka typesafe-stack
我的logback.xml
配置文件中有默认值的变量,我希望能够从我的typesafe配置application.conf
文件中选择性地设置这些变量.
我正在使用one-jar部署应用程序,并且application.conf
可部署jar中打包的文件包含默认值.我传递-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>
Run Code Online (Sandbox Code Playgroud)
application.conf(bundled):
akka {
log-config-on-start = false
event-handlers = ["akka.event.slf4j.Slf4jEventHandler"]
}
Run Code Online (Sandbox Code Playgroud)
示例服务器特定的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
Run Code Online (Sandbox Code Playgroud)
我目前如何运行应用程序:
java -Dfile.encoding=UTF-8 -Dconfig.file=myApp.conf -Dlog.level=WARN -jar myApp_2.10-0.1-one-jar.jar
Run Code Online (Sandbox Code Playgroud)
我选择以编程方式配置具有typesafe配置的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)
}
Run Code Online (Sandbox Code Playgroud)
您可以使用logback提供的PropertyDefiner
界面。非常规的脚手架,但允许您使用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;
}
}
Run Code Online (Sandbox Code Playgroud)
然后,在您的logback.xml文件中:
<configuration>
<define name="loglevel" class="com.myapp.TypesafeConfigPropertyDefiner">
<propertyName>myapp.logging.loglevel</propertyName>
</define>
<root level="${loglevel}">
...
</root>
</configuration>
Run Code Online (Sandbox Code Playgroud)
现在,上面的logback.xml文件myapp.logging.loglevel
将从您的typesafe配置文件(例如application.conf
)中读取。
我不熟悉 Logback,但普通的 Akka 应用程序在其 中附带默认设置reference.conf
,并且您可以在application.conf
. 听起来你想添加第三层配置,这当然是你的权利!
我能看到的最简单的方法是将 your 更改application.conf
为包含 yourfoo.conf
而不是相反。这样 Akka 将加载application.conf
,然后加载foo.conf
.
但如果您需要为每个 JAR 发行版使用不同名称的conf 文件,那么这可能不起作用。在这种情况下,我建议您研究合并配置树以编程方式加载和组合配置。实际上,从 Akka 配置文档中的自定义位置读取配置 几乎正是您想要的,只不过您希望myConfig
从类路径资源加载而不是通过解析字符串来加载(请参阅 Typesafe Config 文档以了解如何做到这一点) 。
关于Logback配置,就像我说的,我不了解Logback。但是您可以像这样从 Typesafe 配置中读取值,并且可以像这样设置 Logback 根记录器级别。