it-swarm.com.ru

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

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

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

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

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

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

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

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

47
LG_

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

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

При инициализации ведения журнала весенняя загрузка просматривает только переменные classpath или окружения (см. http://docs.spring.io/spring-boot/docs/0.5.0.M3/api/org/springframework/boot/context/initializer /LoggingApplicationContextInitializer.html ). 

Лучшее решение, которое я нашел, - включить родительский файл 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' должен быть установлен в аргументах командной строки при запуске приложения. E.G для свойств JVM: -Dspring.profiles.active=dev

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

Edit (несколько активных профилей): Чтобы избежать нескольких файлов, мы могли бы использовать условную обработку, которая требует зависимости 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 для другого примера условной обработки.

63
LG_

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

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
25
Zergleb

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

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

Условная обработка с logback будет решением без большого количества файлов 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>
4
javasenior

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

3
Andriy Rymar

Вы можете указать разные 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>

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

0
sulin