TL;DR: простешую конфигурацию логгирования в Spring Boot (паттерн лога, имя файла лога, уровни логгеров) можно осуществить через файл application.properties, более сложную — через logback.xml (стандартный файл конфигурации для Logback); всегда можно переопределить уровень корневого логгера на debug или trace, передав переменные с соответствующим именем в окружение спринга (например, через application.properties).
Вместо введения
При командной работе над проектом разные его части создаются разными людьми, и потому вы порой не имеете представления, почему что-то работает именно так, как оно есть. В одном из наших проектов изначальной конфигурацией Spring Boot занимался один человек. Далее эта конфигурация дополнялась, но мало кто вникал в то, что было создано изначально. Из-за этого мы столкнулись с проблемами в логах: у нас никак не удавалось включить их на уровень "DEBUG" для конкретного логера, только для всех. Чтобы разобраться с этой проблемой, мне пришлось немного поковыряться в конфигах.
Базовая конфигурация
В принципе, в официальной документации спринга есть примеры конфигурации, которым я пытался следовать, чтобы поменять уровень логирования для конкретного логера (раз и два). Приведу краткую выжимку:
- По умолчанию в Spring Boot используется связка SLF4J и Logback, (при этом Logback при желании несложно заменить на ваш любимый логгер, будь то Log4J или .
- Простейшую конфигурацию можно осуществить через application.properties. Там вы сможете:
- Изменить уровень логирования для коревого (
logging.level.root
) и для любого другого (logging.level.LOGGER_NAME
) логгера.
- Добавить логирование в файл (
logging.file
), задать ограничение на его размер (logging.file.max-size
) и на число архивных файлов логов (logging.file.max-history
), указать каталог для логов (logging.path
).
- Изменить шаблон лога в консоль (
logging.pattern.console
) и в файл (logging.pattern.file
).
- Для более сложной конфигурации можно создать файл конфигурации для используемого логгера (Logback, если вы его не меняли).
- Файл конфигурации может быть расширен спрингом (при правильном названии: logback-spring.xml). Это даст возможность использования тегов
<springProfile name=...>
(условное применение частей конфигурации на основе активных профилей) и
<springProperty source=... name=... defaultValue=.../>
(дает доступ к свойствам из Spring Environment).
У нас использовался третий вариант, но он работал лишь частично: создание в конфигурации секции <root level="LEVEL">...</root>
не меняло уровня логирования, он всегда оставался TRACE. При этом добавление отдельных <logger name=... level=...>
работало — уровень логирования для отдельных логеров задать получалось. Потому мне пришлось расчехлить дебаггер чтобы понять, в какой момент изменяется уровень логирования для корневого логгера.
Экстренное изменение уровня логирования
Дебаг сессия показала, что уровень логирования устанавливается не только на основе файлов конфигурации, но и следующим участком кода класса org.springframework.boot.logging.LoggingApplicationListener
:
private void initializeEarlyLoggingLevel(ConfigurableEnvironment environment) {
if (this.parseArgs && this.springBootLogging == null) {
if (isSet(environment, "debug")) {
this.springBootLogging = LogLevel.DEBUG;
}
if (isSet(environment, "trace")) {
this.springBootLogging = LogLevel.TRACE;
}
}
}
Данный метод вызывается при возникновении события ApplicationEnvironmentPreparedEvent
. В этот момент я догадался посмотреть в файл application.properties, и радостно обнаружил там следующие строки:
#
# Spec for development environment
#
trace = true
debug = true
И вот что сказано про это в документации:
# ----------------------------------------
# CORE PROPERTIES
# ----------------------------------------
debug=false # Enable debug logs.
trace=false # Enable trace logs.
Вывод: задание в окружении переменных debug или trace (будь то задание их в application.properties, запуск приложения с аргументами --debug
или --trace
или передача их аргументами JVM) меняет уровень корневого логгера, и имеет бОльший приоритет, чем заданный в конфигурации.
Засим откланиваюсь, прощайте.