Как я могу настроить параметры системы или параметры конфигурации журнала из configate config?

У меня есть переменные с настройками по умолчанию в моем файле конфигурации logback.xml, и я хотел бы иметь возможность опционально установить эти переменные из моего файла configafe application.conf.

Я развертываю приложение, используя один баннер, а файл application.conf, упакованный в развернутый банку, содержит значения по умолчанию. Я передаю -Dconfig.file=foo.conf при выполнении, чтобы указать путь к конфигурационному файлу, специфичному для сервера.

Прямо сейчас я могу передать -Dlog.level и другие переменные, чтобы переопределить мои значения по умолчанию в logback.xml, и мне также нужно передать -Dfile.encoding=UTF-8 в командной строке. Я ищу способ указать эти свойства в configate config, а не в командной строке. Похоже, что должен быть способ сделать это, но я не могу найти волшебные слова.

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 

Ответы

Ответ 1

Я решил программно настроить 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)
  }

Ответ 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 из вашего конфигурационного файла typeafe (например, application.conf).

Ответ 3

Я не знаком с Logback, но обычное приложение Akka поставляется с настройками по умолчанию в своем reference.conf, и вы переопределяете эти настройки в application.conf. Похоже, вы хотите добавить третий уровень конфигурации, который, безусловно, вы правы!

Самый простой способ - изменить application.conf, чтобы включить foo.conf, а не наоборот. Таким образом, Akka загрузит application.conf, который затем загрузит foo.conf.

Но это может не сработать, если для каждого дистрибутива JAR вам нужен файл с именованным именем conf. В этом случае я рекомендую вам изучить Слияние деревьев конфигурации для программной загрузки и объединения конфигурации. Фактически, Чтение конфигурации из пользовательского местоположения в документах конфигурации Akka - это почти то, что вы хотите, за исключением того, что вы хотите загрузить myConfig из ресурс classpath, а не путем синтаксического анализа строки (см. Документы Configafe Config, чтобы узнать, как это сделать).

Что касается конфигурации Logback, как я уже сказал, я не знаю Logback. Но вы можете прочитать значения конфигурации конфигурации таким образом, и вы можете установить уровень корневого регистратора Logback вот так.