null

Spring Boot и логи

TL;DR: простешую конфигурацию логгирования в Spring Boot (паттерн лога, имя файла лога, уровни логгеров) можно осуществить через файл application.properties, более сложную — через logback.xml (стандартный файл конфигурации для Logback); всегда можно переопределить уровень корневого логгера на debug или trace, передав переменные с соответствующим именем в окружение спринга (например, через application.properties).

Вместо введения

При командной работе над проектом разные его части создаются разными людьми, и потому вы порой не имеете представления, почему что-то работает именно так, как оно есть. В одном из наших проектов изначальной конфигурацией Spring Boot занимался один человек. Далее эта конфигурация дополнялась, но мало кто вникал в то, что было создано изначально. Из-за этого мы столкнулись с проблемами в логах: у нас никак не удавалось включить их на уровень "DEBUG" для конкретного логера, только для всех. Чтобы разобраться с этой проблемой, мне пришлось немного поковыряться в конфигах.

Базовая конфигурация

В принципе, в официальной документации спринга есть примеры конфигурации, которым я пытался следовать, чтобы поменять уровень логирования для конкретного логера (раз и два). Приведу краткую выжимку:

  1. По умолчанию в Spring Boot используется связка SLF4J и Logback, (при этом Logback при желании несложно заменить на ваш любимый логгер, будь то Log4J или .
  2. Простейшую конфигурацию можно осуществить через application.properties. Там вы сможете:
    1. Изменить уровень логирования для коревого (logging.level.root) и для любого другого (logging.level.LOGGER_NAME) логгера.
    2. Добавить логирование в файл (logging.file), задать ограничение на его размер (logging.file.max-size) и на число архивных файлов логов (logging.file.max-history), указать каталог для логов (logging.path).
    3. Изменить шаблон лога в консоль (logging.pattern.console) и в файл (logging.pattern.file).
  3. Для более сложной конфигурации можно создать файл конфигурации для используемого логгера (Logback, если вы его не меняли).
  4. Файл конфигурации может быть расширен спрингом (при правильном названии: 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) меняет уровень корневого логгера, и имеет бОльший приоритет, чем заданный в конфигурации.

 

Засим откланиваюсь, прощайте.