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, не маршрутизується до логів програми. Це запобігає появі в логах програми записів, що виконуються контейнером або іншими додатками, які були розгорнуті в ньому.
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<
Виводяться такі елементи:
Дата та час: точність до мілісекунди та легке сортування.
Рівень ведення логу:
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.*
можна використовувати разом:
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
).
Підтримуються такі властивості політики ротації:
Ім'я | Опис |
---|---|
|
Шаблон імені файлу, який використовується для створення архівів лога. |
|
Якщо очищення архіву лога має відбуватися при запуску програми. p> |
|
Максимальний розмір файлу лога перед його архівацією. |
|
Максимальний розмір видаленого архіву лога перед безпосереднім видаленням. |
|
Максимальна кількість файлів в архіві лога, які потрібно зберігати (за замовчуванням — 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
.
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 не зможе повністю керувати ініціалізацією
лога. Існують відомі особливості із завантаженням класів у Java Util Logging, які викликають проблеми при
запуску з "виконуваного jar-файлу". Ми рекомендуємо по можливості уникати цього при запуску з "виконуваного
jar-файлу".
Для спрощення налаштування деякі інші властивості переносяться з 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
.
Пов'язана з конкретним профілем конфігурація
Тег <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
за допомогою нестрогих правил.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ