|
| 1 | +### Spring (Boot) lessons part 7 - [Логирование](https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#features.logging) |
| 2 | + |
| 3 | +В [папке DOC](https://github.com/JcoderPaul/Spring_Framework_Lessons/tree/master/Spring_part_7/DOC) sql-скрипты и др. полезные файлы. |
| 4 | + |
| 5 | +Док. для изучения: |
| 6 | +- [Simple Logging Facade for Java (SLF4J)](https://www.slf4j.org/) ; |
| 7 | +- [SLF4J user manual](https://www.slf4j.org/manual.html) ; |
| 8 | +________________________________________________________________________________________________________________________ |
| 9 | +- [Spring Boot Reference Documentation](https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/) ; |
| 10 | +- [Spring Framework 6.1.5 Documentation](https://spring.io/projects/spring-framework) ; |
| 11 | +- [Spring Framework 3.2.x Reference Documentation](https://docs.spring.io/spring-framework/docs/3.2.x/spring-framework-reference/html/index.html) ; |
| 12 | +- [Getting Started Guides](https://spring.io/guides) ; |
| 13 | +- [Developing with Spring Boot](https://docs.spring.io/spring-boot/docs/current/reference/html/using.html) ; |
| 14 | +________________________________________________________________________________________________________________________ |
| 15 | +- [Архив Spring-Boot Docs](https://docs.spring.io/spring-boot/docs/) ; |
| 16 | +- [Архив Spring-Framework Docs](https://docs.spring.io/spring-framework/docs/) ; |
| 17 | + |
| 18 | +________________________________________________________________________________________________________________________ |
| 19 | +Для начала проведем предварительную подготовку: |
| 20 | + |
| 21 | +Шаг 1. - в файле [build.gradle](https://github.com/JcoderPaul/Spring_Framework_Lessons/blob/master/Spring_part_7/build.gradle) добавим необходимые plugin-ы: |
| 22 | + |
| 23 | + /* |
| 24 | + Плагин Spring Boot он добавляет необходимые задачи в Gradle |
| 25 | + и имеет обширную взаимосвязь с другими plugin-ами. |
| 26 | + */ |
| 27 | + id 'org.springframework.boot' version '3.1.3' |
| 28 | + /* |
| 29 | + Менеджер зависимостей позволяет решать проблемы несовместимости |
| 30 | + различных версий и модулей Spring-а |
| 31 | + */ |
| 32 | + id "io.spring.dependency-management" version '1.0.11.RELEASE' |
| 33 | + /* Подключим Lombok */ |
| 34 | + id "io.freefair.lombok" version "8.3" |
| 35 | + |
| 36 | +Шаг 2. - подключаем Spring Boot: |
| 37 | + |
| 38 | + /* |
| 39 | + Подключим Spring Boot Starter он включает поддержку |
| 40 | + авто-конфигурации, логирование и YAML |
| 41 | + */ |
| 42 | + implementation 'org.springframework.boot:spring-boot-starter' |
| 43 | + |
| 44 | +________________________________________________________________________________________________________________________ |
| 45 | +#### Lesson 31 - Logging Starter. |
| 46 | + |
| 47 | +Java имеет массу фреймворков [для логирования](https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#features.logging) см. [DOC/Logging_System.jpg](https://github.com/JcoderPaul/Spring_Framework_Lessons/blob/master/Spring_part_7/DOC/Logging_System.jpg): |
| 48 | +- [Log4J](https://logging.apache.org/log4j/2.x/) ; |
| 49 | +- [Jdk14l](https://docs.oracle.com/en/java/javase/17/docs/api/java.logging/java/util/logging/package-summary.html) ; |
| 50 | +- [LogBack](https://logback.qos.ch/) ; |
| 51 | + |
| 52 | +Обычно в Spring есть выбор, но по умолчанию используется Logback. Однако для взаимодействия с системами логирования |
| 53 | +используется slf4j API ([набор интерфейсов и классов](https://www.slf4j.org/api/)). Так же, для большинства логеров, нужен binding - адаптер, |
| 54 | +описывающий, как нам передавать информацию из нашего приложения через API в конкретный логер. |
| 55 | + |
| 56 | +И только для Logback адаптер не требуется, еще раз см. [DOC/Logging_System.jpg](https://github.com/JcoderPaul/Spring_Framework_Lessons/blob/master/Spring_part_7/DOC/Logging_System.jpg). В Spring есть стартер для системы |
| 57 | +логирования logback - '[spring-boot-starter-logging](https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#using.build-systems.starters)', он подхватывается автоматически (как транзитивная зависимость) |
| 58 | +при добавлении Spring Boot стартера. Мы легко можем поменять (отключить) систему логирования на другую (исключив |
| 59 | +одну и подключив другую): |
| 60 | + |
| 61 | + implementation ('org.springframework.boot:spring-boot-starter'){ |
| 62 | + exclude group: 'org.springframework.boot', module: 'spring-boot-starter-logging' |
| 63 | + } |
| 64 | + implementation 'org.springframework.boot:spring-boot-starter-log4j2' |
| 65 | + |
| 66 | +Уровни логирования имеют приоритет и отображение их идет от худшего к менее критичному, т.е. если мы настроили |
| 67 | +систему логирования на запись только FATAL ситуаций, то только они и будут фиксироваться, если же, например, на |
| 68 | +ERROR (см. [DOC/Log_Level.jpg](https://github.com/JcoderPaul/Spring_Framework_Lessons/blob/master/Spring_part_7/DOC/Log_Level.jpg)), то теперь будут записываться уже и FATAL и ERROR. И так далее по иерархии вниз до |
| 69 | +TRACE (пишем абсолютно все уровни логирования). |
| 70 | + |
| 71 | +Подключить систему логирования к классу просто, например, используя аннотацию [@Slf4j](https://projectlombok.org/api/lombok/extern/slf4j/Slf4j) над всем классом. А сервисные |
| 72 | +сообщения можно передавать в логер (см. [JpaConfiguration.java](https://github.com/JcoderPaul/Spring_Framework_Lessons/blob/master/Spring_part_7/src/main/java/spring/oldboy/config/JpaConfiguration.java)): |
| 73 | + |
| 74 | + log.info("Jpa configuration is enabled"); |
| 75 | + |
| 76 | +Мы используем именно эту аннотацию, чтобы не привязываться к конкретной реализации логера, т.е. использование |
| 77 | +[slf4j API](https://www.slf4j.org/) позволяет поставлять любую систему журналирования процессов динамически. |
| 78 | + |
| 79 | +Простые примеры использования аннотации [@Slf4j](https://projectlombok.org/api/lombok/extern/slf4j/Slf4j) и ее методов |
| 80 | +для логирования событий приложения: |
| 81 | +- [ConnectionPool.java](https://github.com/JcoderPaul/Spring_Framework_Lessons/blob/master/Spring_part_7/src/main/java/spring/oldboy/pool/ConnectionPool.java); |
| 82 | +- [CompanyRepository.java](https://github.com/JcoderPaul/Spring_Framework_Lessons/blob/master/Spring_part_7/src/main/java/spring/oldboy/repository/CompanyRepository.java); |
| 83 | + |
| 84 | +Док. для изучения: |
| 85 | +- [Spring Boot features 2.1.13.RELEASE (Logging)](https://docs.spring.io/spring-boot/docs/2.1.13.RELEASE/reference/html/boot-features-logging.html) ; |
| 86 | +- [Spring Boot features 3.3.* (Logging)](https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#features.logging) ; |
| 87 | + |
| 88 | +________________________________________________________________________________________________________________________ |
| 89 | +#### Lesson 32 - Logback Configuration. |
| 90 | + |
| 91 | +Конфигурировать логер в нашем Spring Boot, на верхнем уровне, достаточно просто, можно использовать [application.yml](https://github.com/JcoderPaul/Spring_Framework_Lessons/blob/master/Spring_part_7/src/main/resources/application.yml) (выгрузка событий происходит и в консоль, и [в файл](https://github.com/JcoderPaul/Spring_Framework_Lessons/blob/master/Spring_part_7/Logs/oldboy.log)): |
| 92 | + |
| 93 | + logging: |
| 94 | + # Зададим уровень логирования корневого логера |
| 95 | + level: |
| 96 | + # Будем фиксировать сообщения типа WARN и все что выше (ERROR и FATAL) |
| 97 | + root: WARN |
| 98 | + spring.oldboy.pool: INFO |
| 99 | + # Записываем лог в файл |
| 100 | + file.name: Logs/oldboy.log |
| 101 | + |
| 102 | +Основные default настройки Spring Boot находятся в *.XML файлах самого Spring пакета см. |
| 103 | +[DOC/Logback_base_etc_XML.jpg](https://github.com/JcoderPaul/Spring_Framework_Lessons/blob/master/Spring_part_7/DOC/Logback_base_etc_XML.jpg) (или саму структуру jar файла), но мы можем создавать свои файлы конфигурации. |
| 104 | + |
| 105 | +Внутренняя структура [base.xml](https://github.com/spring-projects/spring-boot/blob/main/spring-boot-project/spring-boot/src/main/resources/org/springframework/boot/logging/logback/base.xml) для примера: |
| 106 | + |
| 107 | + <included> |
| 108 | + <include resource="org/springframework/boot/logging/logback/defaults.xml" /> |
| 109 | + <property name="LOG_FILE" value="${LOG_FILE:-${LOG_PATH:-${LOG_TEMP:-${java.io.tmpdir:-/tmp}}}/spring.log}"/> |
| 110 | + <include resource="org/springframework/boot/logging/logback/console-appender.xml" /> |
| 111 | + <include resource="org/springframework/boot/logging/logback/file-appender.xml" /> |
| 112 | + <root level="INFO"> |
| 113 | + <appender-ref ref="CONSOLE" /> |
| 114 | + <appender-ref ref="FILE" /> |
| 115 | + </root> |
| 116 | + </included> |
| 117 | + |
| 118 | +Во всех системах логирования есть два основных понятия (см. код выше): |
| 119 | +- appender-ы - куда мы выгружаем наши логи (событийные данные), т.е. конкретный 'потребитель' (консоль - [console-appender.xml](https://github.com/spring-projects/spring-boot/blob/main/spring-boot-project/spring-boot/src/main/resources/org/springframework/boot/logging/logback/console-appender.xml), |
| 120 | + файл - [file-appender.xml](https://github.com/spring-projects/spring-boot/blob/main/spring-boot-project/spring-boot/src/main/resources/org/springframework/boot/logging/logback/file-appender.xml), БД, удаленный сервер); |
| 121 | +- logger-ы - те кто выгружают данные в указанные appender-ы (причем логеры могут поставлять данные во |
| 122 | + все appender-ы сразу и в консоль, и в файл и ...); |
| 123 | + |
| 124 | +Более подробно об этом можно прочитать в переводных статьях по логированию (конфигурированию логеров) в |
| 125 | +Spring приложениях с использованием Logback (данные местами устаревшие, но раскрывающие логику |
| 126 | +происходящего): |
| 127 | + |
| 128 | +- [DOC/ArticlesAboutLogging/YAML_SpringBoot_Config_Logback.txt](https://github.com/JcoderPaul/Spring_Framework_Lessons/blob/master/Spring_part_7/DOC/ArticlesAboutLogging/YAML_SpringBoot_Config_Logback.txt) - описание настройки *.yaml файлов для |
| 129 | +конфигурирования Spring Boot Logging; |
| 130 | +- [DOC/ArticlesAboutLogging/LoggingBegin.txt](https://github.com/JcoderPaul/Spring_Framework_Lessons/blob/master/Spring_part_7/DOC/ArticlesAboutLogging/LoggingBegin.txt) - описание принципов работы логеров в Spring Boot; |
| 131 | +- [DOC/ArticlesAboutLogging/LoggingWithXML.txt](https://github.com/JcoderPaul/Spring_Framework_Lessons/blob/master/Spring_part_7/DOC/ArticlesAboutLogging/LoggingWithXML.txt) - конфигурирование Logback при помощи *.XML файлов; |
| 132 | +- [DOC/ArticlesAboutLogging/LogbackWithSpringBoot.txt](https://github.com/JcoderPaul/Spring_Framework_Lessons/blob/master/Spring_part_7/DOC/ArticlesAboutLogging/LogbackWithSpringBoot.txt) - применение Logback в Spring приложениях; |
| 133 | + |
| 134 | +Как описано в статьях, если мы захотим полностью переписать (максимально кастомизировать) настройки |
| 135 | +по логированию нашего приложения нам придется создать файлы свойств и настроек в одном из удобных для |
| 136 | +нас форматах XML, YML, Groovy. |
| 137 | + |
| 138 | +См. официальную документацию: |
| 139 | +- [Spring Boot Logging](https://docs.spring.io/spring-boot/docs/3.3.x/reference/htmlsingle/#features.logging) ; |
| 140 | +- [Spring Boot Custom Log Configuration](https://docs.spring.io/spring-boot/docs/3.1.3/reference/htmlsingle/#features.logging.custom-log-configuration) ; |
| 141 | + |
| 142 | +И конечно для работы с Logback и slf4j API: |
| 143 | +- [SLF4J USER MANUAL](https://www.slf4j.org/manual.html) ; |
| 144 | +- [Logback Project](https://logback.qos.ch/index.html) ; |
| 145 | +- [The logback manual](https://logback.qos.ch/manual/index.html) ; |
| 146 | +- [Logback configuration](https://logback.qos.ch/manual/configuration.html) ; |
| 147 | + |
| 148 | +Мы можем использовать для [Logback](https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#howto.logging.logback), как и описано в документации зарезервированные названия XML файлов, например |
| 149 | +logback-spring.xml (для просмотра переименовали в [logback_spring_demo.xml](https://github.com/JcoderPaul/Spring_Framework_Lessons/blob/master/Spring_part_7/src/main/resources/logback_spring_demo.xml)) и прописать там все наши |
| 150 | +демонстрационные настройки (взятые из документации по Logback, как пример). |
| 151 | + |
| 152 | +И это работает для любой системы логирования см. [DOC/Logging_System.jpg](https://github.com/JcoderPaul/Spring_Framework_Lessons/blob/master/Spring_part_7/DOC/Logging_System.jpg). |
| 153 | + |
| 154 | +________________________________________________________________________________________________________________________ |
| 155 | +См. официальные [Guides](https://spring.io/guides): |
| 156 | +- [Getting Started Guides](https://spring.io/guides) - Эти руководства, рассчитанные на 15–30 минут, содержат быстрые |
| 157 | +практические инструкции по созданию «Hello World» для любой задачи разработки с помощью Spring. В большинстве случаев |
| 158 | +единственными необходимыми требованиями являются JDK и текстовый редактор. |
| 159 | +- [Topical Guides](https://spring.io/guides#topicals) - Тематические руководства предназначенные для прочтения и |
| 160 | +понимания за час или меньше, содержит более широкий или субъективный контент, чем руководство по началу работы. |
| 161 | +- [Tutorials](https://spring.io/guides#tutorials) - Эти учебники, рассчитанные на 2–3 часа, обеспечивают более глубокое |
| 162 | +контекстное изучение тем разработки корпоративных приложений, что позволяет вам подготовиться к внедрению реальных |
| 163 | +решений. |
| 164 | +________________________________________________________________________________________________________________________ |
| 165 | +- [Spring Projects на GitHub](https://github.com/spring-projects) ; |
| 166 | +________________________________________________________________________________________________________________________ |
0 commit comments