Как я могу настроить параметры системы или параметры конфигурации журнала из 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 вот так.