Spring Boot использует Commons Logging для всеохватывающего логирования (журналирования, logging) на внутреннем уровне, но оставляет открытой базовую реализацию лога. Конфигурации по умолчанию предусмотрены для Java Util Logging, Log4J2 и Logback. В каждом случае диспетчеры логирования предварительно сконфигурированы на использование консольного вывода с возможностью вывода в файл.

По умолчанию, если используются "Стартеры", для ведения лога используется Logback. Соответствующая маршрутизация Logback также предусмотрена для обеспечения корректной работы зависимых библиотек, использующих Java Util Logging, Commons Logging, Log4J или SLF4J.

Для Java доступно множество фреймворков логирования. Не волнуйтесь, если приведенный выше список вводит в ступор. Как правило, изменять зависимости логирования не нужно, и настройки Spring Boot по умолчанию работают просто отлично.
Если вы развертываете свое приложение в контейнере сервлетов или на сервере приложений, логирование, выполняемое с помощью API- интерфейса Java Util Logging, не маршрутизируется к логам приложения. Это предотвращает появление в логах приложения записей, выполняемых контейнером или другими приложениями, которые были развернуты в нем.

Формат логгера

Вывод лога по умолчанию в Spring Boot похож на следующий пример:

2022-10-20 12:40:11.311  INFO 16138 --- [           main] o.s.b.d.f.s.MyApplication                : Starting MyApplication using Java 1.8.0_345 on myhost with PID 16138 (/opt/apps/myapp.jar started by myuser in /opt/apps/)
2022-10-20 12:40:11.330  INFO 16138 --- [           main] o.s.b.d.f.s.MyApplication                : No active profile set, falling back to 1 default profile: "default"
2022-10-20 12:40:13.056  INFO 16138 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8080 (http)
2022-10-20 12:40:13.070  INFO 16138 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2022-10-20 12:40:13.070  INFO 16138 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.68]
2022-10-20 12:40:13.178  INFO 16138 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2022-10-20 12:40:13.178  INFO 16138 --- [           main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 1762 ms
2022-10-20 12:40:13.840  INFO 16138 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''
2022-10-20 12:40:13.850  INFO 16138 --- [           main] o.s.b.d.f.s.MyApplication                : Started MyApplication in 4.062 seconds (JVM running for 5.452)

Выводятся следующие элементы:

  • Дата и время: точность до миллисекунды и легкая сортировка.

  • Уровень ведения лога: ERROR, WARN, INFO, DEBUG или TRACE.

  • Идентификатор процесса.

  • Разделитель --- для разделения начала фактических сообщений лога.

  • Название потока: заключено в квадратные скобки (может быть усечено для вывода в консоль).

  • Имя диспетчера логирования: обычно это имя исходного класса (часто сокращенное).

  • Сообщение лога.

Logback не имеет уровня FATAL. Он отображается на ERROR.

Консольный вывод

В конфигурации лога по умолчанию сообщения отражаются в консоль по мере их записи. По умолчанию в лог записываются сообщения уровней ERROR, WARN и INFO. Вы также можете активировать режим "отладки", запустив приложение с флагом --debug.

$ java -jar myapp.jar --debug
Также можно задать debug=true в файле application.properties.

Если режим отладки активирован, набор основных диспетчеров логирования (встроенный контейнер, Hibernate и Spring Boot) конфигурируется для вывода дополнительной информации. Активация режима отладки не конфигурирует приложение на регистрацию всех сообщений с уровнем DEBUG.

Кроме того, можно активировать режим "трассировки", запустив приложение с флагом --trace (или trace=true в файле application.properties). Это позволяет регистрировать лог трассировки для ряда основных диспетчеров логирования (встроенный контейнер, генерация схемы Hibernate и весь портфель Spring).

Вывод с цветовой подсветкой

Если терминал поддерживает ANSI, для облегчения чтения используется цветовой вывод. Можно установить spring.output.ansi.enabled в поддерживаемое значение чтобы переопределить автоматическое обнаружение.

Цветовое кодирование конфигурируется с помощью слова преобразования %clr. В своей простейшей форме преобразователь окрашивает вывод в соответствии с уровнем лога, как показано в следующем примере:

%clr(%5p)

В следующей таблице описано соответствие уровней лога цветам:

Уровень Цвет

FATAL

Красный

ERROR

Красный

WARN

Желтый

INFO

Зеленый

DEBUG

Зеленый

TRACE

Зеленый

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

%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){yellow}

Поддерживаются следующие цвета и стили:

  • blue

  • cyan

  • faint

  • green

  • magenta

  • red

  • yellow

Вывод в файл

По умолчанию Spring Boot ведет лог только в консоли и не ведет запись в файлы лога. Если необходимо осуществлять запись в файлы лога в дополнение к выводу в консоль, необходимо установить свойство logging.file.name или logging.file.path (например, в файле application.properties).

В следующей таблице показано, как свойства logging.* можно использовать вместе:5

Таблица 5. Свойства логирования
logging.file.name logging.file.path Пример Описание

(отсутствует)

(отсутствует)

Выводит записи лога исключительно в консоль.

Конкретный файл

(отсутствует)

my.log

Осуществляет запись в указанный файл лога. Имена могут быть точным местоположением или быть связанными с текущим каталогом.

(отсутствует)

Конкретный каталог

/var/log

Осуществляет запись spring.log в указанный каталог. Имена могут быть точным местоположением или быть связанными с текущим каталогом.

Файлы лога ротируются, если их размер достигает 10 МБ, и, как и в случае с выводом в консоль, по умолчанию регистрируются сообщения уровней ERROR, WARN и INFO.

Свойства логирования не зависят от фактической инфраструктуры логирования. Следовательно, специфические конфигурационные ключи (например, logback.configurationFile для Logback) не находятся под управлением Spring Boot.

Ротация файлов

Если вы используете Logback, можно точно настроить параметры ротации лога с помощью файла application.properties или application.yaml. Для всех других систем логирования нужно будет самостоятельно конфигурировать параметры ротации (например, если вы используете Log4J2, то можете добавить файл log4j2.xml или log4j2-spring.xml).

Поддерживаются следующие свойства политики ротации:

Имя Описание

logging.logback.rollingpolicy.file-name-pattern

Шаблон имени файла, используемый для создания архивов лога.

logging.logback.rollingpolicy.clean-history-on-start

Если очистка архива лога должна происходить при запуске приложения.

logging.logback.rollingpolicy.max-file-size

Максимальный размер файла лога перед его архивацией.

logging.logback.rollingpolicy.total-size-cap

Максимальный размер удаляемого архива лога перед непосредственным удалением.

logging.logback.rollingpolicy.max-history

Максимальное количество файлов в архиве лога, которые необходимо хранить (по умолчанию 7).

Уровни ведения лога

Все поддерживаемые системы логирования могут иметь уровни ведения лога, установленные в Environment из Spring (например, в application.properties) с помощью logging.level.<logger-name>=<level>, где level – один из уровней, среди которых TRACE, DEBUG, INFO, WARN, ERROR, FATAL или OFF. Можно сконфигурировать root диспетчер логирования с помощью logging.level.root.

В следующем примере показаны возможные параметры логирования в application.properties:

Properties
logging.level.root=warn
logging.level.org.springframework.web=debug
logging.level.org.hibernate=error
Yaml
logging:
  level:
    root: "warn"
    org.springframework.web: "debug"
    org.hibernate: "error"

Также можно установить уровни ведения лога с помощью переменных окружения. Например, LOGGING_LEVEL_ORG_SPRINGFRAMEWORK_WEB=DEBUG установит для org.springframework.web значение DEBUG.

Приведенный выше подход сработает только для логирования на уровне пакетов. Поскольку нестрогая привязка всегда преобразует переменные окружения в нижний регистр, настроить логирование для отдельного класса таким образом невозможно. Если требуется настроить логирование для класса, то можно использовать переменную SPRING_APPLICATION_JSON.

Группы логов

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

Чтобы помочь в этом, Spring Boot позволяет определять группы логирования в вашей Environment для Spring. Например, вот как вы можете определить "tomcat-группу", добавив ее в файл application.properties:

Properties
logging.group.tomcat=org.apache.catalina,org.apache.coyote,org.apache.tomcat
Yaml
logging:
  group:
    tomcat: "org.apache.catalina,org.apache.coyote,org.apache.tomcat"

После определения можно изменять уровень для всех диспетчеров логирования в группе с помощью одной строки:

Properties
logging.level.tomcat=trace
Yaml
logging:
  level:
    tomcat: "trace"

Spring Boot содержит следующие предопределенные группы логирования, которые можно использовать "из коробки":

Имя Диспетчеры логирования

web

org.springframework.core.codec, org.springframework.http, org.springframework.web, org.springframework.boot.actuate.endpoint.web, org.springframework.boot.web.servlet.ServletContextInitializerBeans

sql

org.springframework.jdbc.core, org.hibernate.SQL, org.jooq.tools.LoggerListener

Использование перехватчика завершения работы лога

Чтобы высвободить ресурсы логирования при завершении работы приложения, предусмотрен перехватчик завершения, который запускает очистку системы логирования при выходе из JVM. Этот перехватчик завершения регистрируется автоматически, если только ваше приложение не развернуто в виде war-файла. Если приложение имеет сложную иерархию контекстов, перехватчик завершения может не соответствовать вашим потребностям. Если он не соответствует им, отключите перехватчик завершения и рассмотрите варианты, предусмотренные непосредственно базовой системой логирования. Например, Logback прдусматривает контекстные селекторы, которые позволяют создавать каждый Logger в своем собственном контексте. Можно использовать свойство logging.register-shutdown-hook, чтобы отключить перехватчик завершения. Установка значения в false отключает регистрацию. Можно установить это свойство в файле application.properties или application.yaml:

Properties
logging.register-shutdown-hook=false
Yaml
logging:
  register-shutdown-hook: false

Кастомная конфигурация лога

Различные системы логирования можно активировать путем включения соответствующих библиотек в classpath и дополнительно специфически настроить путем передачи соответствующего конфигурационного файла в корне classpath или в местоположении, заданном следующим свойством Environment для Spring: logging.config.

Можно сделать так, чтобы Spring Boot в принудительном порядке использовать определенную систему логирования при помощи системного свойства org.springframework.boot.logging.LoggingSystem. Значение должно быть полным именем класса реализации LoggingSystem. Также можно полностью отключить конфигурацию логирования Spring Boot, используя значение none.

Поскольку логирование инициализируется перед созданием ApplicationContext, невозможно управлять логированием через аннотацию @PropertySources в файлах Spring с аннотацией @Configuration. Единственный способ изменить систему логирования или полностью отключить ее – через системные свойства.

В зависимости от системы логирования загружаются следующие файлы:

Система логирования Настройка

Logback

logback-spring.xml, logback-spring.groovy, logback.xml, или logback.groovy

Log4j2

log4j2-spring.xml или log4j2.xml

JDK (Java Util Logging)

logging.properties

Если это возможно, рекомендуем использовать варианты -spring для конфигурации логирования (например, logback-spring.xml, а не logback.xml). Если используются стандартные местоположения конфигурации, Spring не сможет полностью управлять инициализацией лога.
Существуют известные особенности с загрузкой классов в Java Util Logging, которые вызывают проблемы при запуске из "исполняемого jar-файла". Мы рекомендуем по возможности избегать этого при запуске из "исполняемого jar-файла".

Для упрощения настройки некоторые другие свойства переносятся из Environment для Spring в системные свойства, как описано в следующей таблице:

Окружение Spring Системное свойство Комментарии

logging.exception-conversion-word

LOG_EXCEPTION_CONVERSION_WORD

Слово преобразования, используемое при регистрации исключений.

logging.file.name

LOG_FILE

Если определено, то используется в конфигурации лога по умолчанию.

logging.file.path

LOG_PATH

Если определено, то используется в конфигурации лога по умолчанию.

logging.pattern.console

CONSOLE_LOG_PATTERN

Шаблон лога для использования с консолью (STDOUT).

logging.pattern.dateformat

LOG_DATEFORMAT_PATTERN

Шаблон аппендера для форматирования даты лога.

logging.charset.console

CONSOLE_LOG_CHARSET

Кодировка, используемая для ведения лога с выводом в консоль.

logging.pattern.file

FILE_LOG_PATTERN

Шаблон лога для использования в файле (если активировано свойство LOG_FILE).

logging.charset.file

FILE_LOG_CHARSET

Кодировка, используемая для ведения лога в файлах (если активировано свойство LOG_FILE).

logging.pattern.level

LOG_LEVEL_PATTERN

Формат, используемый при визуализации уровня лога (по умолчанию %5p).

PID

PID

Идентификатор текущего процесса (распознается, если это возможно и если он еще не определен как переменная окружения ОС).

Если вы используете Logback, также передаются следующие свойства:

Окружение Spring Системное свойство Комментарии

logging.logback.rollingpolicy.file-name-pattern

LOGBACK_ROLLINGPOLICY_FILE_NAME_PATTERN

Шаблон для имен архивных файлов лога (по умолчанию ${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz).

logging.logback.rollingpolicy.clean-history-on-start

LOGBACK_ROLLINGPOLICY_CLEAN_HISTORY_ON_START

Указывает, нужно ли очищать файлы в архиве лога при запуске.

logging.logback.rollingpolicy.max-file-size

LOGBACK_ROLLINGPOLICY_MAX_FILE_SIZE

Максимальный размер файла лога.

logging.logback.rollingpolicy.total-size-cap

LOGBACK_ROLLINGPOLICY_TOTAL_SIZE_CAP

Общий размер хранимых резервных копий лога.

logging.logback.rollingpolicy.max-history

LOGBACK_ROLLINGPOLICY_MAX_HISTORY

Максимальное количество файлов в архиве лога, которые необходимо хранить.

Все поддерживаемые системы логирования могут обращаться к системным свойствам при парсинге своих конфигурационных файлов. Смотрите примеры конфигураций по умолчанию в spring-boot.jar:

Если вам нужно использовать плейсхолдер в свойстве логирования, то следует придерживаться синтаксиса Spring Boot, а не синтаксиса базового фреймворка. В частности, если вы используете Logback, то следует использовать : в качестве разделителя между именем свойства и его значением по умолчанию, а не :-.

Можно добавлять MDC-контекст и другое специальное содержимое в строки лога, переопределяя только LOG_LEVEL_PATTERN (или logging.pattern.level в Logback). Например, если вы используете logging.pattern.level=user:%X{user} %5p, то формат логгера по умолчанию содержит запись MDC для "user", если она существует, как показано в следующем примере.

2019-08-30 12:30:04.031 user:someone INFO 22174 --- [  nio-8080-exec-0] demo.Controller
Handling authenticated request

Расширения Logback

Spring Boot содержит ряд расширений для Logback, которые могут упростить углубленное конфигурирование. Можно использовать эти расширения в конфигурационном файле logback-spring.xml.

Поскольку стандартный конфигурационный файл logback.xml загружается слишком рано, расширения в нем использовать нельзя. Необходимо либо использовать logback-spring.xml, либо определить свойство logging.config.
Расширения нельзя использовать со сканированием конфигурации из Logback. Если вы попытаетесь сделать это, внесение изменений в файл конфигурации приведет к регистрации ошибки, подобной одной из следующих:
ERROR in ch.qos.logback.core.joran.spi.Interpreter@4:71 - no applicable action for [springProperty], current ElementPath is [[configuration][springProperty]]
ERROR in ch.qos.logback.core.joran.spi.Interpreter@4:71 - no applicable action for [springProfile], current ElementPath is [[configuration][springProfile]]

Связанная с конкретным профилем конфигурация

Тег <springProfile> позволяет по желанию включать или исключать разделы конфигурации на основе активных профилей Spring. Разделы профиля поддерживаются в любом месте элемента <configuration>. Используйте атрибут name, чтобы задать, какой профиль принимает конфигурацию. Тег <springProfile> может содержать имя профиля (например, staging) или выражение профиля. Выражение профиля позволяет выразить более сложную логику профиля (например, production & (eu-central | eu-west)). В следующем листинге показаны три образца профилей:

<springProfile name="staging">
    <!-- конфигурация, которая будет активирована, если профиль "staging" активен -->
</springProfile>
<springProfile name="dev | staging">
    <!-- конфигурация, которая будет активирована, если профиль "dev" или "staging" активен -->
</springProfile>
<springProfile name="!production">
    <!-- конфигурация, которая будет активирована, если профиль "production" активен -->
</springProfile>

Свойства окружения

Тег <springProperty> позволяет открывать свойства из Environment в Spring для использования в Logback. Это может быть полезно, если необходимо получить доступ к значениям из файла application.properties в конфигурации Logback. Этот тег работает так же, как и стандартный тег <property> в Logback. Однако вместо задания прямого value вы задаете source свойства (из Environment). Если необходимо хранить свойство не в local области доступности, то можно использовать атрибут scope. Если необходимо запасное значение (на случай, если свойство не установлено в Environment), можно использовать атрибут defaultValue. В следующем примере показано, как открыть свойства для использования в Logback:

<springProperty scope="context" name="fluentHost" source="myapp.fluentd.host"
        defaultValue="localhost"/>
<appender name="FLUENT" class="ch.qos.logback.more.appenders.DataFluentAppender">
    <remoteHost>${fluentHost}</remoteHost>
    ...
</appender>
Задавать source нужно в кебаб-регистре (например, my.property-name). Однако свойства можно добавлять в Environment посредством нестрогих правил.