Spring (Boot) lessons part 7 - Логирование
В папке DOC sql-скрипты и др. полезные файлы.
Док. для изучения:
- Spring Boot Reference Documentation ;
- Spring Framework 6.1.5 Documentation ;
- Spring Framework 3.2.x Reference Documentation ;
- Getting Started Guides ;
- Developing with Spring Boot ;
Для начала проведем предварительную подготовку:
Шаг 1. - в файле build.gradle добавим необходимые plugin-ы:
/*
Плагин Spring Boot он добавляет необходимые задачи в Gradle
и имеет обширную взаимосвязь с другими plugin-ами.
*/
id 'org.springframework.boot' version '3.1.3'
/*
Менеджер зависимостей позволяет решать проблемы несовместимости
различных версий и модулей Spring-а
*/
id "io.spring.dependency-management" version '1.0.11.RELEASE'
/* Подключим Lombok */
id "io.freefair.lombok" version "8.3"
Шаг 2. - подключаем Spring Boot:
/*
Подключим Spring Boot Starter он включает поддержку
авто-конфигурации, логирование и YAML
*/
implementation 'org.springframework.boot:spring-boot-starter'
Java имеет массу фреймворков для логирования см. DOC/Logging_System.jpg:
Обычно в Spring есть выбор, но по умолчанию используется Logback. Однако для взаимодействия с системами логирования используется slf4j API (набор интерфейсов и классов). Так же, для большинства логеров, нужен binding - адаптер, описывающий, как нам передавать информацию из нашего приложения через API в конкретный логер.
И только для Logback адаптер не требуется, еще раз см. DOC/Logging_System.jpg. В Spring есть стартер для системы логирования logback - 'spring-boot-starter-logging', он подхватывается автоматически (как транзитивная зависимость) при добавлении Spring Boot стартера. Мы легко можем поменять (отключить) систему логирования на другую (исключив одну и подключив другую):
implementation ('org.springframework.boot:spring-boot-starter'){
exclude group: 'org.springframework.boot', module: 'spring-boot-starter-logging'
}
implementation 'org.springframework.boot:spring-boot-starter-log4j2'
Уровни логирования имеют приоритет и отображение их идет от худшего к менее критичному, т.е. если мы настроили систему логирования на запись только FATAL ситуаций, то только они и будут фиксироваться, если же, например, на ERROR (см. DOC/Log_Level.jpg), то теперь будут записываться уже и FATAL и ERROR. И так далее по иерархии вниз до TRACE (пишем абсолютно все уровни логирования).
Подключить систему логирования к классу просто, например, используя аннотацию @Slf4j над всем классом. А сервисные сообщения можно передавать в логер (см. JpaConfiguration.java):
log.info("Jpa configuration is enabled");
Мы используем именно эту аннотацию, чтобы не привязываться к конкретной реализации логера, т.е. использование slf4j API позволяет поставлять любую систему журналирования процессов динамически.
Простые примеры использования аннотации @Slf4j и ее методов для логирования событий приложения:
Док. для изучения:
Конфигурировать логер в нашем Spring Boot, на верхнем уровне, достаточно просто, можно использовать application.yml (выгрузка событий происходит и в консоль, и в файл):
logging:
# Зададим уровень логирования корневого логера
level:
# Будем фиксировать сообщения типа WARN и все что выше (ERROR и FATAL)
root: WARN
spring.oldboy.pool: INFO
# Записываем лог в файл
file.name: Logs/oldboy.log
Основные default настройки Spring Boot находятся в *.XML файлах самого Spring пакета см. DOC/Logback_base_etc_XML.jpg (или саму структуру jar файла), но мы можем создавать свои файлы конфигурации.
Внутренняя структура base.xml для примера:
<included>
<include resource="org/springframework/boot/logging/logback/defaults.xml" />
<property name="LOG_FILE" value="${LOG_FILE:-${LOG_PATH:-${LOG_TEMP:-${java.io.tmpdir:-/tmp}}}/spring.log}"/>
<include resource="org/springframework/boot/logging/logback/console-appender.xml" />
<include resource="org/springframework/boot/logging/logback/file-appender.xml" />
<root level="INFO">
<appender-ref ref="CONSOLE" />
<appender-ref ref="FILE" />
</root>
</included>
Во всех системах логирования есть два основных понятия (см. код выше):
- appender-ы - куда мы выгружаем наши логи (событийные данные), т.е. конкретный 'потребитель' (консоль - console-appender.xml, файл - file-appender.xml, БД, удаленный сервер);
- logger-ы - те кто выгружают данные в указанные appender-ы (причем логеры могут поставлять данные во все appender-ы сразу и в консоль, и в файл и ...);
Более подробно об этом можно прочитать в переводных статьях по логированию (конфигурированию логеров) в Spring приложениях с использованием Logback (данные местами устаревшие, но раскрывающие логику происходящего):
- DOC/ArticlesAboutLogging/YAML_SpringBoot_Config_Logback.txt - описание настройки *.yaml файлов для конфигурирования Spring Boot Logging;
- DOC/ArticlesAboutLogging/LoggingBegin.txt - описание принципов работы логеров в Spring Boot;
- DOC/ArticlesAboutLogging/LoggingWithXML.txt - конфигурирование Logback при помощи *.XML файлов;
- DOC/ArticlesAboutLogging/LogbackWithSpringBoot.txt - применение Logback в Spring приложениях;
Как описано в статьях, если мы захотим полностью переписать (максимально кастомизировать) настройки по логированию нашего приложения нам придется создать файлы свойств и настроек в одном из удобных для нас форматах XML, YML, Groovy.
См. официальную документацию:
И конечно для работы с Logback и slf4j API:
Мы можем использовать для Logback, как и описано в документации зарезервированные названия XML файлов, например logback-spring.xml (для просмотра переименовали в logback_spring_demo.xml) и прописать там все наши демонстрационные настройки (взятые из документации по Logback, как пример).
И это работает для любой системы логирования см. DOC/Logging_System.jpg.
См. официальные Guides:
- Getting Started Guides - Эти руководства, рассчитанные на 15–30 минут, содержат быстрые практические инструкции по созданию «Hello World» для любой задачи разработки с помощью Spring. В большинстве случаев единственными необходимыми требованиями являются JDK и текстовый редактор.
- Topical Guides - Тематические руководства предназначенные для прочтения и понимания за час или меньше, содержит более широкий или субъективный контент, чем руководство по началу работы.
- Tutorials - Эти учебники, рассчитанные на 2–3 часа, обеспечивают более глубокое контекстное изучение тем разработки корпоративных приложений, что позволяет вам подготовиться к внедрению реальных решений.