Вход в Spring Boot с SLF4J

Введение Журналы сервера - важная часть разработки, в которой фиксируются действия или события, которые система выполняет в любой момент времени. Spring Boot по умолчанию использует ведение журнала Apache Commons [https://commons.apache.org/proper/commons-logging/] для своих системных журналов. Кроме того, по умолчанию вы можете использовать любую из платформ ведения журналов в рамках API SLF4J [http://www.slf4j.org/docs.html], например Logback (по умолчанию), Log4J2 и Java Util Logging в Spring Boot. .

Вступление

Журналы сервера - важная часть разработки, в которой фиксируются действия или события, которые система выполняет в любой момент времени.

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 является конфигурацией уровня журнала по умолчанию.

comments powered by Disqus