Вступление
Журналы сервера - важная часть разработки, в которой фиксируются действия или события, которые система выполняет в любой момент времени.
Spring Boot по умолчанию использует ведение журнала Apache Commons для своих системных журналов. Кроме того, по умолчанию вы можете использовать любую из платформ ведения журнала в рамках API SLF4J, такую как Logback (по умолчанию), Log4J2 и Java Util Logging в Spring Boot.
Ведение журнала приложений - это мощный инструмент разработки, который важен для поддержки и отладки на производственном уровне. Каждая запись журнала содержит такую информацию, как отметка времени, фактический вызываемый метод, настраиваемое сообщение журнала и другую контекстную информацию. Каждая запись журнала также включает идентификатор, называемый уровнем ведения журнала.
В этом руководстве мы рассмотрим, как выполнять ведение журнала в Spring Boot с помощью SLF4J, а также уровни журналов и конфигурацию, необходимую для их настройки, и группы журналов.
Сообщения журнала в Spring Boot
Чтобы включить ведение журнала в Spring, импортируйте Logger
и
LoggerFactory
из библиотеки API org.slf4j
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
После этого объявите константу для хранения службы LoggerFactory
журнала для класса с помощью LoggerFactory:
private static final Logger log = LoggerFactory.getLogger(DemoService.class);
Этот log
обычно определяется в самом верху списка глобальных
переменных, поскольку он является константой. Предоставляя класс,
который вы хотите регистрировать, он полностью настроен и готов к вызову
с предоставленными сообщениями.
В качестве альтернативы вы можете просто аннотировать класс с помощью
@Slf4j
который автоматически сгенерирует регистратор для класса без
объявления константы. Аннотация предоставляет статическую переменную с
именем log
которая по умолчанию предоставляет утилиты логгера:
@Slf4j
@Service
public class DemoService {
//...
}
Примечание . Наиболее распространенным идентификатором регистратора
является log
, хотя во многих случаях вы также увидите logger
На
самом деле, вы можете называть его как хотите, но log
лаконичен и
избавляет вас от написания более длинного имени из-за частых звонков.
Вход в Spring Boot состоит из разных уровней. Каждый журнал имеет степень срочности или важности, которая связана с уровнем журнала. Уровни журнала настраиваются во время выполнения, и каждый запрос журнала проверяет уровень журнала, чтобы узнать, имеет ли запрос такой же или более высокий приоритет, чем уровень журнала, который должен отображаться.
Если вы попытаетесь записать в журнал сообщение, которое считается менее важным, чем определенный порог, оно просто не будет зарегистрировано.
Возьмем, к примеру, этот блок с сообщениями важности журнала в порядке убывания:
public void logLevelDisplay () {
logger.error("Error message");
logger.warn("Warning message");
logger.info("Info message");
logger.debug("Debug message");
logger.trace("Trace message");
}
Если никакие конфигурации не заданы в application.properties
или
где-либо еще, уровень журнала по умолчанию будет INFO
. Поэтому, если
бы мы вызывали метод logLevelDisplay()
, он выводил бы что-то вроде
этого:
2020-12-20 12:46:35.880 ERROR 47958 --- [nio-8080-exec-1] c.service.DemoService : Error message
2020-12-20 12:46:52.976 WARN 47958 --- [nio-8080-exec-1 c.service.DemoService : Warn message
2020-12-20 12:46:59.104 INFO 47958 --- [nio-8080-exec-1] c.service.DemoService : Info message
Сообщения DEBUG
и TRACE
не отображались, потому что уровень журнала
приложения установлен на INFO
, который имеет более высокий уровень
приоритета, чем два.
Если уровень журнала был установлен на ERROR
, то будет отображаться
только сообщение об ошибке, поскольку это самый высокий уровень журнала
из 5 встроенных уровней.
Это подводит нас к важной теме - уровням логов , которые заслуживают отдельного объяснения.
Уровни журнала в Spring Boot
Вход в Spring Boot состоит из разных уровней. Каждый журнал имеет
степень срочности или важности, которая связана с уровнем журнала.
Например, SQL-запросы Hibernate классифицируются как DEBUG
, это
уровень журнала с низкой срочностью, который в основном вызывается для
целей отладки.
Уровни ведения журнала позволяют различать следующие образцы журналов:
- Информация о
User
обновленаJohn
Jon
на Jon. - NullPointerException :
id
User
равенnull
Первый журнал - это общий информативный тип сообщения, а второй журнал -
это сообщение NullPointerException
Эти журналы имеют разные уровни срочности, и различие между ними с
использованием уровней журнала важно для фильтрации журналов, которые не
должны выводиться в зависимости от обстоятельств. Если происходит
серьезная ошибка, вы не хотите, чтобы она была загромождена кучей
рабочих низкоуровневых журналов INFO
SLF4J предоставляет 5 уровней ведения журнала по умолчанию при загрузке Spring:
ERROR
Журналы ошибок - это серьезные проблемы, которые влияют на
значительную часть системы или некоторые части вашего приложения не
работают. Исключения рассматриваются ERROR
журналы уровня. Другими
примерами журналов ошибок являются сбои подключения к базе данных и
ошибки конфигурации. ERROR
- это самый срочный уровень журнала по
умолчанию в SLF4J.
WARN
- журналы предупреждений используются для обозначения
потенциальных проблем, которые могут вызвать ошибки, и их следует
отслеживать в случае их сбоя. Конечно, контекст предупреждения является
субъективным для разработчика и ситуации, поэтому журналы предупреждений
могут отличаться от системы к системе.
INFO
- INFO
- это уровень ведения журнала по умолчанию, который
устанавливается Spring Boot. Если никакие настройки не выполняются,
уровень журнала автоматически устанавливается на INFO
. Эти типы
журналов представляют собой информацию, которая обычно не требуется, но
полезна в таких ситуациях, как отладка производственного кода или
определение того, когда определенные данные обрабатываются.
DEBUG
- DEBUG
содержат более подробную и конкретную информацию,
которая не требуется в обычных ситуациях. Это часто устанавливается как
уровень журнала, когда разработчик пытается глубоко отследить проблему
или ошибку, которую трудно отследить.
TRACE
- TRACE
- это более детальная версия DEBUG
. TRACE
являются исчерпывающими: представьте, что они регистрируют каждую
операцию, выполняемую системой, от запуска службы до инициализации новых
переменных и вызова методов.
В порядке срочности ERROR
является самым срочным, а TRACE
- наименее
срочным журналом. Уровень журнала по умолчанию в Spring Boot - INFO
если не задана ручная конфигурация.
Настройка уровней журнала в Spring Boot
Уровни журнала можно установить в среде Spring, задав его конфигурации в
application.properties
.
Формат для установки конфигурации уровня журнала -
logging.level.[classpath] = [level]
. Путь к классам указан, поскольку
разные компоненты приложения могут быть настроены с разными уровнями
журнала, что особенно полезно для изоляции кода и отладки.
Чтобы указать уровень журнала для всех классов, у которых нет
собственных настроек уровня журнала, root
журнал может быть установлен
с помощью logging.level.root
.
В application.properties
:
logging.level.root=INFO
logging.level.com.test=DEBUG
logging.level.com.service.DemoService=WARN
Из этой конфигурации для каждого класса, кроме DemoService
и классов в
com.test
будет установлен уровень журнала INFO
, в то время как
test
классы и DemoService
иметь свои собственные заданные уровни
журнала.
Группы журналов
Группы журналов - это удобный способ установить конфигурации
регистратора для группы классов с разными путями к классам. Например,
если вы хотите установить для всех уровней журнала тестовых классов
значение DEBUG
за один раз. Это возможно с помощью конфигурации
logging.group.[groupName]
:
# Initialize log group
logging.group.test=com.test, com.test-prod, com.apptest
# Set log level to log group
logging.level.test=DEBUG
При таком подходе вам не придется постоянно индивидуально устанавливать уровень журнала для всех связанных компонентов.
Заключение
Знание о различных уровнях журнала важно, особенно в таких ситуациях, как отладка в производственной среде.
Допустим, в производственной среде обнаружена серьезная ошибка, а в
текущих журналах не хватает информации для диагностики основной причины
проблемы. При изменении уровня журнала на DEBUG
или TRACE
в журналах
будет отображаться столь необходимая информация, чтобы точно определить
важные детали, которые могут привести к исправлению.
В Spring конфигурации уровня журнала могут быть установлены в
application.properties
который обрабатывается во время выполнения.
Spring поддерживает 5 уровней журнала по умолчанию: ERROR
, WARN
,
INFO
, DEBUG
и TRACE
, причем INFO
является конфигурацией уровня
журнала по умолчанию.