17

我的logback.xml配置文件中有默认变量,我希望能够从我的类型安全配置application.conf文件中选择设置这些变量。

我正在使用 one-jar 部署应用程序,并且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 
4

3 回答 3

6

你可以使用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;
    }
}

然后,在您的 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)。

于 2014-12-19T14:22:13.777 回答
6

我选择以编程方式配置具有类型安全配置的 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)
  }
于 2013-12-04T06:47:06.007 回答
2

我不熟悉 Logback,但一个普通的 Akka 应用程序在reference.confapplication.conf. 听起来你想添加第三层配置,这当然是你的权利!

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

但是,如果您需要为每个 JAR 发行版使用不同名称的 conf 文件,这可能不起作用。在这种情况下,我建议您查看Merging Config Trees以编程方式加载和组合配置。实际上,从 Akka 配置文档中的自定义位置读取配置 几乎正是您想要的,除了您希望myConfig从类路径资源加载而不是通过解析字符串(请参阅 Typesafe 配置文档以了解如何做到这一点) .

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

于 2013-02-26T21:38:43.263 回答