Как определить логические переменные/свойства перед автозагрузкой logback.xml?

В моей компании есть инструмент управления средой, который позволяет вам искать свойства из среды программно в Java. Я хочу использовать этот инструмент для настройки logback. Например, предположим, что у меня есть logback.xml, как указано ниже (в частности, раздел приложения файла):

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <!-- console appender -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{yyyy-MM-dd/HH:mm:ss.SSS} [%thread] %-5level %logger{20}: %msg%n</pattern>
        </encoder>
    </appender>

    <!-- file appender -->
    <appender name="FILE" class="ch.qos.logback.core.FileAppender">
        <file>${LOG_FILE:-/default/log/file/path</file>
        <encoder>
            <pattern>%d{yyyy-MM-dd/HH:mm:ss.SSS} [%thread] %-5level %logger{20}: %msg%n</pattern>
        </encoder>
    </appender>

    <root level="DEBUG">
        <appender-ref ref="CONSOLE" />
        <appender-ref ref="FILE" />
    </root>
</configuration>

Итак, в этом случае я хочу найти свойство LOG_FILE из среды (или ОС, если вы это сделаете), и передать ее в журнал до того, как logback загрузит logback.xml, чтобы он знал значение of LOG_FILE. Итак, как я могу это достичь? BTW, я знаю, как определить программный appender программно, но это не то, что я хочу здесь.

Большое спасибо.

Ответы

Ответ 1

Немного поцарапав голову, я соглашаюсь со следующим решением.

Сначала поместите logback.xml за пределы пути к классам, чтобы журнал не загружал ничего автоматически.

Во-вторых, добавьте настройки из среды в свойства системы, чтобы журнал мог просматривать их при анализе logback.xml.

В-третьих, программно настроить logback в коде приложения. (Официальная документация по регистрации имеет один хороший пример этого.)

Готово.

Ответ 2

Определите свойство и загрузите его с помощью контекста:

<property scope="context" name="logfolder" value="${location.of.the.log.folder}" />

Затем определите свой appender, ссылающийся на свойство:

<appender name="FILE" class="ch.qos.logback.core.FileAppender">
    <file>${logfolder}/logfile.log</file>
    <append>true</append>
    <encoder>
        <pattern>[%d{ISO8601}] [%p] [%t] [%c] [%m]%n</pattern>
    </encoder>
</appender>

Ответ 3

Я хочу посмотреть свойство LOG_FILE из среды (или ОС, если вы это сделаете)

Вот альтернативы:

  • Если по среде вы имеете в виду то, что обычно известно как переменные окружения, вы можете обращайтесь к ним непосредственно в файле конфигурации без особых проблем.

  • Если вы не имеете в виду переменные среды, а что-то, что требует доступа к пользовательскому коду, вы можете реализовать пользовательский ch.qos. logback.core.spi.PropertyDefiner, который захватывает и возвращает значение.

    например.

    public class MyCompanyEnvironmentGrabber extends PropertyDefinerBase {
    
        @Override
        public String getPropertyValue() {
            return ...; // grab the value from company environment
        }
    }
    
  • Там очевидно сообщает, что можно программно настроить переменную до загрузки logback.xml, поставив ее перед любыми вызовами logger, и соблюдая порядок загрузки ClassLoader... Однако, я думаю, что это очень хрупкое, поскольку не использовать static logger очень сложно контролировать, когда база кода становится сложной.

Все сказано, поскольку logback.xml загружается почти сразу после запуска экземпляра Java, безопасные способы динамического задания значения переменной кажутся ограниченными: