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 или свойстве командной строки).
Ответы
Ответ 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>
Это очень просто, не нужно больше ничего делать.