Spring Boot использует Commons Logging для всеохватывающего логирования (журналирования, logging) на внутреннем уровне, но оставляет открытой базовую реализацию лога. Конфигурации по умолчанию предусмотрены для Java Util Logging, Log4J2 и Logback. В каждом случае диспетчеры логирования предварительно сконфигурированы на использование консольного вывода с возможностью вывода в файл.
По умолчанию, если используются "Стартеры", для ведения лога используется Logback. Соответствующая маршрутизация Logback также предусмотрена для обеспечения корректной работы зависимых библиотек, использующих Java Util Logging, Commons Logging, Log4J или SLF4J.
Формат логгера
Вывод лога по умолчанию в 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
. -
Идентификатор процесса.
-
Разделитель
---
для разделения начала фактических сообщений лога. -
Название потока: заключено в квадратные скобки (может быть усечено для вывода в консоль).
-
Имя диспетчера логирования: обычно это имя исходного класса (часто сокращенное).
-
Сообщение лога.
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)
В следующей таблице описано соответствие уровней лога цветам:
Уровень | Цвет |
---|---|
|
Красный |
|
Красный |
|
Желтый |
|
Зеленый |
|
Зеленый |
|
Зеленый |
Кроме того, можно задать цвет или стиль, который необходимо использовать, указав его в качестве параметра для преобразования. Например, чтобы сделать текст желтым, используйте следующую конфигурацию:
%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
logging.file.name |
logging.file.path |
Пример | Описание |
---|---|---|---|
(отсутствует) |
(отсутствует) |
Выводит записи лога исключительно в консоль. |
|
Конкретный файл |
(отсутствует) |
|
Осуществляет запись в указанный файл лога. Имена могут быть точным местоположением или быть связанными с текущим каталогом. |
(отсутствует) |
Конкретный каталог |
|
Осуществляет запись |
Файлы лога ротируются, если их размер достигает 10 МБ, и, как и в случае с выводом в консоль, по умолчанию регистрируются сообщения уровней ERROR
, WARN
и INFO
.
logback.configurationFile
для Logback) не находятся под управлением Spring Boot.Ротация файлов
Если вы используете Logback, можно точно настроить параметры ротации лога с помощью файла application.properties
или application.yaml
. Для всех других систем логирования нужно будет самостоятельно конфигурировать параметры ротации (например, если вы используете Log4J2, то можете добавить файл log4j2.xml
или log4j2-spring.xml
).
Поддерживаются следующие свойства политики ротации:
Имя | Описание |
---|---|
|
Шаблон имени файла, используемый для создания архивов лога. |
|
Если очистка архива лога должна происходить при запуске приложения. |
|
Максимальный размер файла лога перед его архивацией. |
|
Максимальный размер удаляемого архива лога перед непосредственным удалением. |
|
Максимальное количество файлов в архиве лога, которые необходимо хранить (по умолчанию 7). |
Уровни ведения лога
Все поддерживаемые системы логирования могут иметь уровни ведения лога, установленные в Environment
из Spring (например, в application.properties
) с помощью logging.level.<logger-name>=<level>
, где level
– один из уровней, среди которых TRACE, DEBUG, INFO, WARN, ERROR, FATAL или OFF. Можно сконфигурировать root
диспетчер логирования с помощью logging.level.root
.
В следующем примере показаны возможные параметры логирования в application.properties
:
logging.level.root=warn
logging.level.org.springframework.web=debug
logging.level.org.hibernate=error
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
:
logging.group.tomcat=org.apache.catalina,org.apache.coyote,org.apache.tomcat
logging:
group:
tomcat: "org.apache.catalina,org.apache.coyote,org.apache.tomcat"
После определения можно изменять уровень для всех диспетчеров логирования в группе с помощью одной строки:
logging.level.tomcat=trace
logging:
level:
tomcat: "trace"
Spring Boot содержит следующие предопределенные группы логирования, которые можно использовать "из коробки":
Имя | Диспетчеры логирования |
---|---|
web |
|
sql |
|
Использование перехватчика завершения работы лога
Чтобы высвободить ресурсы логирования при завершении работы приложения, предусмотрен перехватчик завершения, который запускает очистку системы логирования при выходе из JVM. Этот перехватчик завершения регистрируется автоматически, если только ваше приложение не развернуто в виде war-файла. Если приложение имеет сложную иерархию контекстов, перехватчик завершения может не соответствовать вашим потребностям. Если он не соответствует им, отключите перехватчик завершения и рассмотрите варианты, предусмотренные непосредственно базовой системой логирования. Например, Logback прдусматривает контекстные селекторы, которые позволяют создавать каждый Logger в своем собственном контексте. Можно использовать свойство logging.register-shutdown-hook
, чтобы отключить перехватчик завершения. Установка значения в false
отключает регистрацию. Можно установить это свойство в файле application.properties
или application.yaml
:
logging.register-shutdown-hook=false
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 |
|
Log4j2 |
|
JDK (Java Util Logging) |
|
-spring
для конфигурации логирования (например, logback-spring.xml
, а не logback.xml
). Если используются стандартные местоположения конфигурации, Spring не сможет полностью управлять инициализацией лога.Для упрощения настройки некоторые другие свойства переносятся из Environment
для Spring в системные свойства, как описано в следующей таблице:
Окружение Spring | Системное свойство | Комментарии |
---|---|---|
|
|
Слово преобразования, используемое при регистрации исключений. |
|
|
Если определено, то используется в конфигурации лога по умолчанию. |
|
|
Если определено, то используется в конфигурации лога по умолчанию. |
|
|
Шаблон лога для использования с консолью (STDOUT). |
|
|
Шаблон аппендера для форматирования даты лога. |
|
|
Кодировка, используемая для ведения лога с выводом в консоль. |
|
|
Шаблон лога для использования в файле (если активировано свойство |
|
|
Кодировка, используемая для ведения лога в файлах (если активировано свойство |
|
|
Формат, используемый при визуализации уровня лога (по умолчанию |
|
|
Идентификатор текущего процесса (распознается, если это возможно и если он еще не определен как переменная окружения ОС). |
Если вы используете Logback, также передаются следующие свойства:
Окружение Spring | Системное свойство | Комментарии |
---|---|---|
|
|
Шаблон для имен архивных файлов лога (по умолчанию |
|
|
Указывает, нужно ли очищать файлы в архиве лога при запуске. |
|
|
Максимальный размер файла лога. |
|
|
Общий размер хранимых резервных копий лога. |
|
|
Максимальное количество файлов в архиве лога, которые необходимо хранить. |
Все поддерживаемые системы логирования могут обращаться к системным свойствам при парсинге своих конфигурационных файлов. Смотрите примеры конфигураций по умолчанию в 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
.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
посредством нестрогих правил.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ