Подтвердить что ты не робот

Spring свойство boot, logback и logging.config

Я реализую ведение журнала в весеннем загрузочном проекте с библиотекой logback. Я хочу загрузить разные файлы конфигурации журналирования в соответствии с моими весенними профилями (свойство 'spring.pofiles.active'). У меня есть 3 файла: logback- dev.xml, logback- inte.xml и logback- prod.xml. Я использую весеннюю загрузку версии 1.2.2.

Как вы можете прочитать spring загрузочной документации (здесь). Это говорит:

Различные системы ведения журналов могут быть активированы путем включения соответствующих библиотек в путь к классам и дополнительно настроены путем предоставления подходящего файла конфигурации в корне пути к классам или в месте, указанном свойством Spring Environment logging.config. (Однако обратите внимание, что, поскольку ведение журнала инициализируется до создания ApplicationContext, невозможно управлять ведением журнала из @PropertySources в файлах Spring @Configuration. Свойства системы и обычные внешние файлы конфигурации Spring Boot работают очень хорошо.)

Поэтому я попытался установить свойство 'logging.config' в моем файле application.properties:

logging.config=classpath:/logback-${spring.profiles.active}.xml

Но когда я запускаю свое приложение, мой logback- {profile}.xml не загружается...

Я думаю, что регистрация - это общая проблема, с которой сталкиваются все проекты, использующие весеннюю загрузку. Я на правильном пути с вышеупомянутым подходом? У меня есть другие решения, которые работают, но я нахожу их не такими элегантными (условный анализ с Janino в файле logback.xml или свойстве командной строки).

4b9b3361

Ответ 1

Я нашел решение и понял, почему Spring не использует мое свойство 'logging.config', определенное в файле application.properties.

Решение и объяснение:

При инициализации ведения журнала Spring Boot просматривает только переменные classpath или окружения.

Решением, которое я использовал, было включение родительского файла logback.xml, который включал правильный файл конфигурации регистрации в соответствии с профилем весны.

logback.xml:

<configuration>
    <include resource="logback-${spring.profiles.active}.xml"/>
</configuration>

logback- [профиль].xml (в данном случае logback- dev.xml):

<included>

    <!-- put your appenders -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
    <!-- encoders are assigned the type
     ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
       <encoder>
           <pattern>%d{ISO8601} %p %t %c{0}.%M - %m%n</pattern>
           <charset>utf8</charset>
        </encoder>
    </appender>

    <!-- put your loggers here -->
    <logger name="org.springframework.web" additivity="false" level="INFO">
        <appender-ref ref="CONSOLE" />
    </logger>

    <!-- put your root here -->
    <root level="warn">
        <appender-ref ref="CONSOLE" />
    </root>

</included>

Примечание: "spring.profiles.active" должен быть установлен в аргументах командной строки при запуске приложения. -Dspring.profiles.active=dev для свойств JVM: -Dspring.profiles.active=dev

Справочные документы:

Редактировать (несколько активных профилей): чтобы избежать нескольких файлов, мы могли бы использовать условную обработку, которая требует зависимости Janino (настройка здесь), см. Условную документацию. С помощью этого метода мы можем также проверить несколько активных профилей одновременно. Например (я не тестировал это решение, поэтому, пожалуйста, прокомментируйте, если оно не работает):

<configuration>

    <if condition='"${spring.profiles.active}".contains("profile1")'>
        <then>
         <!-- do whatever you want for profile1 -->
        </then>
    </if>

    <if condition='"${spring.profiles.active}".contains("profile2")'>
        <then>
         <!-- do whatever you want for profile2 -->
        </then>
    </if>

    <!-- common config -->

</configuration>

См. Javasenior answer для другого примера условной обработки.

Ответ 2

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

application-prod.properties

logging.config=classpath:logback-prod.xml

application-dev.properties

logging.config=classpath:logback-dev.xml

application-local.properties

logging.config=classpath:logback-local.xml

Быть осторожным

Если вы не будете осторожны, вы можете зайти куда-нибудь неожиданно

-Dspring.profiles.active=local,dev //will use logback-dev.xml
-Dspring.profiles.active=dev,local //will use logback-local.xml

Ответ 3

Вместо добавления отдельных xmls logback для каждого профиля или наличия условия IF, я бы предложил следующее (если у вас меньше различий в xmls ') для простой условной обработки:

<springProfile name="dev">
<logger name="org.sample" level="DEBUG" />
</springProfile>
<springProfile name="prod">
<logger name="org.sample" level="TRACE" />
</springProfile>

Ответ 4

Условная обработка с logback будет решением без большого количества файлов logback. Вот ссылка и пример конфигурации входа с пружинными профилями.

<configuration>

    <property name="LOG_LEVEL" value="INFO"/>

        <if condition='"product".equals("${spring.profiles.active}")'>
           <then>
                <property name="LOG_LEVEL" value="INFO"/>
           </then>
           <else>
                <property name="LOG_LEVEL" value="ERROR"/>
           </else>
        </if>

         .
         .
         appender, logger tags etc.
         .
         .

         <root level="${LOG_LEVEL}">
             <appender-ref ref="STDOUT"/>
         </root>

</configuration>

Кроме того, вам, возможно, придется добавить это в ваш pom.xml

<dependency>
    <groupId>org.codehaus.janino</groupId>
    <artifactId>janino</artifactId>
    <version>3.0.6</version>
</dependency>

Ответ 5

Spring имеет поддержку следующего тега <springProperty/> внутри XML файла журнала журнала, этот тег описан здесь. Это означает, что вы можете легко добавить переменную из файла свойств Spring, даже это значение переменной разрешается из переменной среды/системы на Spring.

Ответ 6

Вы можете указать разные logback.xml для другого профиля, всего 3 шага:

1, укажите активный профиль в application.properties или application.yml:

spring.profiles.active: test

2, Config Logback, чтобы включить различные конфигурации в зависимости от профиля:

<!DOCTYPE configuration>
<configuration scan="true" scanPeriod="30 seconds">
    <springProperty scope="context" name="profile" source="spring.profiles.active"/>
    <include resource="logback.${profile}.xml"/>
</configuration>

3. Создайте файл конфигурации logback.test.xml:

<?xml version="1.0" encoding="UTF-8"?>
<included>
    <include resource="org/springframework/boot/logging/logback/base.xml"/>
    <root level="INFO"/>
</included>

Это очень просто, не нужно больше ничего делать.