Рубрики
Без рубрики

Вход в весеннюю загрузку

Узнайте, как легко настроить наиболее популярные решения для ведения журнала в приложении Spring Boot.

Автор оригинала: Andrea Ligios.

1. Обзор

В этом коротком уроке мы рассмотрим основные параметры ведения журнала, доступные в Spring Boot.

Более подробная информация о логбэке доступна в Руководстве по логбэку , в то время как Log4j2 представлен во введении к Log4j2 – Добавлениям, Макетам и фильтрам .

Дальнейшее чтение:

Установка уровня журнала в Spring Boot при тестировании

Отображение отчета об автоматической настройке при весенней загрузке

2. Начальная настройка

Давайте сначала создадим модуль загрузки Spring. Рекомендуемый способ сделать это-использовать Spring Initializr , который мы рассмотрим в нашем учебнике Spring Boot .

Теперь давайте создадим наш единственный файл класса, Logging Controller :

@RestController
public class LoggingController {

    Logger logger = LoggerFactory.getLogger(LoggingController.class);

    @RequestMapping("/")
    public String index() {
        logger.trace("A TRACE Message");
        logger.debug("A DEBUG Message");
        logger.info("An INFO Message");
        logger.warn("A WARN Message");
        logger.error("An ERROR Message");

        return "Howdy! Check out the Logs to see the output...";
    }
}

Как только мы загрузим веб-приложение, мы сможем запустить эти строки журнала, просто посетив http://localhost:8080/ .

3. Ведение журнала Нулевой конфигурации

Spring Boot-очень полезный фреймворк. Это позволяет нам забыть о большинстве настроек конфигурации, многие из которых он самоуверенно настраивает автоматически.

В случае ведения журнала единственной обязательной зависимостью является ведение журнала Apache Commons.

Нам нужно импортировать его только при использовании Spring 4.x ( Spring Boot 1.x ), так как он предоставляется модулем Spring Framework spring-jcl в Spring 5 ( Spring Boot 2.x ).

Мы вообще не должны беспокоиться об импорте spring-jcl , если мы используем Spring Boot Starter (что мы почти всегда делаем). Это потому, что каждый стартер , как и наш spring-boot-starter-web , зависит от spring-boot-starter-logging, который уже тянет spring-jcl для нас.

3.1. Ведение журнала Обратной связи по умолчанию

При использовании стартеров по умолчанию для ведения журнала используется Logback.

Spring Boot предварительно настраивает его с помощью шаблонов и цветов ANSI, чтобы сделать стандартный вывод более читаемым.

Давайте теперь запустим приложение и посетим http://localhost:8080/ страница, и посмотрите, что происходит в консоли:

Как мы видим, уровень ведения журнала по умолчанию в регистраторе установлен на INFO, что означает, что ТРАССИРОВКА и ОТЛАДКА сообщения не видны.

Чтобы активировать их без изменения конфигурации, мы можем передать аргументы –debug или –trace в командной строке :

java -jar target/spring-boot-logging-0.0.1-SNAPSHOT.jar --trace

3.2. Уровни журнала

Spring Boot также дает нам доступ к более детальной настройке уровня журнала с помощью переменных среды. Есть несколько способов, которыми мы можем это сделать.

Во-первых, мы можем установить уровень ведения журнала в наших параметрах виртуальной машины:

-Dlogging.level.org.springframework=TRACE 
-Dlogging.level.com.baeldung=TRACE

В качестве альтернативы, если мы используем Maven, мы можем определить параметры журнала с помощью командной строки :

mvn spring-boot:run 
  -Dspring-boot.run.arguments=--logging.level.org.springframework=TRACE,--logging.level.com.baeldung=TRACE

При работе с Gradle мы можем передавать настройки журнала через командную строку. Для этого потребуется установить задачу загрузки .

Как только это будет сделано, мы запустим приложение:

./gradlew bootRun -Pargs=--logging.level.org.springframework=TRACE,--logging.level.com.baeldung=TRACE

Если мы хотим навсегда изменить многословие, мы можем сделать это в файле application.properties , как описано здесь :

logging.level.root=WARN
logging.level.com.baeldung=TRACE

Наконец, мы можем изменить уровень ведения журнала навсегда, используя наш файл конфигурации структуры ведения журнала.

Мы уже упоминали, что Spring Boot Starter по умолчанию использует Logback. Давайте посмотрим, как определить фрагмент файла конфигурации обратного входа, в котором мы устанавливаем уровень для двух отдельных пакетов:


Помните, что если уровень журнала для пакета определяется несколько раз с использованием различных параметров, упомянутых выше, но с различными уровнями журнала, будет использоваться самый низкий уровень.

Таким образом, если мы установим уровни ведения журнала с использованием Logback, Spring Boot и переменных среды одновременно, уровень журнала будет TRACE , так как он является самым низким среди запрошенных уровней.

4. Ведение журнала конфигурации Обратной связи

Несмотря на то, что конфигурация по умолчанию полезна (например, для начала работы в нулевое время во время POCs или быстрых экспериментов), ее, скорее всего, недостаточно для наших повседневных потребностей.

Давайте посмотрим, как включить конфигурацию обратного входа с другим цветом и шаблоном ведения журнала, с отдельными спецификациями для консоли и файла вывода, а также с приличной скользящей политикой , чтобы избежать создания огромных файлов журналов.

Во-первых, мы должны найти решение, которое позволяет обрабатывать только наши параметры ведения журнала, а не загрязнять application.properties, который обычно используется для многих других параметров приложения.

Если файл в пути к классу имеет одно из следующих имен, Spring Boot автоматически загрузит его поверх конфигурации по умолчанию:

  • Если файл в пути к классу имеет одно из следующих имен, Spring Boot автоматически загрузит его
  • поверх конфигурации по умолчанию:
  • Если файл в пути к классу имеет одно из следующих имен, Spring Boot автоматически загрузит его
  • поверх конфигурации по умолчанию:

Spring рекомендует использовать -spring вариант поверх простых, когда это возможно, как описано здесь .

Давайте напишем простую logback-spring.xml :




    

    
        
            
                %black(%d{ISO8601}) %highlight(%-5level) [%blue(%t)] %yellow(%C{1.}): %msg%n%throwable
            
        
    

    
        ${LOGS}/spring-boot-logger.log
        
            %d %p %C{1.} [%t] %m%n
        

        
            
            ${LOGS}/archived/spring-boot-logger-%d{yyyy-MM-dd}.%i.log
            
            
                10MB
            
        
    
    
    
    
        
        
    

    
    
        
        
    


И когда мы запускаем приложение, вот результат:

Как мы видим, теперь он регистрирует TRACE и DEBUG сообщения, и общий шаблон консоли текстуально и хроматически отличается от предыдущего.

Теперь он также регистрирует файл в папке /logs , созданной по текущему пути, и архивирует его с помощью скользящей политики.

5. Ведение журнала конфигурации Log4j2

В то время как ведение журнала Apache Commons лежит в основе, а Logback является эталонной реализацией, все маршруты к другим библиотекам ведения журнала уже включены, чтобы упростить переключение на них.

Однако для того, чтобы использовать любую библиотеку журналов, отличную от Log back, нам нужно исключить ее из наших зависимостей.

Для каждого стартера, подобного этому (это единственный в нашем примере, но у нас их может быть много):


    org.springframework.boot
    spring-boot-starter-web

нам нужно превратить его в тощую версию и (только один раз) добавить нашу альтернативную библиотеку, здесь через сам стартер:


    org.springframework.boot
    spring-boot-starter-web
    
        
            org.springframework.boot
            spring-boot-starter-logging
        
    


    org.springframework.boot
    spring-boot-starter-log4j2

На этом этапе нам нужно поместить в путь к классу файл с именем одного из следующих:

  • На этом этапе нам нужно поместить в путь к классу файл с именем одного из следующих:
  • На этом этапе нам нужно поместить в путь к классу файл с именем одного из следующих:

Мы будем печатать через Log4j2 (через SLF4J) без дальнейших изменений.

Давайте напишем простую log4j2-spring.xml :



    
        
            
        

        
            
                %d %p %C{1.} [%t] %m%n
            
            
                
                
                
                
            
        
    

    
        
        
            
            
        

        
        
    


И когда мы запускаем приложение, вот результат:

Как мы видим, результат сильно отличается от логбэка — доказательство того, что мы теперь полностью используем Log4j2.

В дополнение к конфигурации XML, Log4j2 позволяет нам также использовать конфигурацию YAML или JSON, описанную здесь .

6. Log4j2 Без SLF4J

Мы также можем использовать Log4j2 изначально, не проходя через SLF4J.

Для этого мы просто используем собственные классы:

import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.LogManager;
// [...]
Logger logger = LogManager.getLogger(LoggingController.class);

Нам не нужно вносить какие-либо другие изменения в стандартную конфигурацию весенней загрузки Log4j2.

Теперь мы можем использовать совершенно новые функции Log4j2, не зацикливаясь на старом интерфейсе SLF4J. Но мы также привязаны к этой реализации, и нам нужно будет переписать наш код при переходе на другую структуру ведения журнала.

7. Ведение Журнала С Ломбоком

В примерах, которые мы видели до сих пор, нам пришлось объявить экземпляр регистратора из нашей структуры ведения журнала.

Этот шаблонный код может раздражать. Мы можем избежать этого, используя различные аннотации, введенные Ломбоком.

Сначала нам нужно будет добавить зависимость Lombok в наш скрипт сборки, чтобы работать с ней:


    org.projectlombok
    lombok
    1.18.4
    provided

7.1. @Slf4j и @CommonsLog

API ведения журнала SLF4J и Apache Commons позволяют нам гибко изменять нашу структуру ведения журнала без какого-либо влияния на наш код.

И мы можем использовать Lombok @Slf4j и @Commons аннотации , чтобы добавить правильный экземпляр регистратора в наш класс: org.slf4j.Регистратор для SLF4J и org.apache.commons.регистрация.Log для ведения журнала Apache Commons.

Чтобы увидеть эти аннотации в действии, давайте создадим класс, аналогичный Logging Controller , но без экземпляра регистратора. Мы называем его Lombok Logging Controller и аннотируем его @Slf4j :

@RestController
@Slf4j
public class LombokLoggingController {
 
    @RequestMapping("/lombok")
    public String index() {
        log.trace("A TRACE Message");
        log.debug("A DEBUG Message");
        log.info("An INFO Message");
        log.warn("A WARN Message");
        log.error("An ERROR Message");
 
        return "Howdy! Check out the Logs to see the output...";
    }
}

Обратите внимание, что мы немного скорректировали фрагмент, используя log в качестве экземпляра регистратора. Это связано с тем, что добавление аннотации @Slf4j автоматически добавляет поле с именем log .

С Ведение журнала нулевой конфигурации , приложение будет использовать базовую реализацию ведения журнала Logback для ведения журнала. Аналогично, реализация Log4j2 используется для ведения журнала с помощью Log4j2-Ведения журнала конфигурации.

Мы получаем такое же поведение, когда заменяем аннотацию @Slf4j на @CommonsLog.

7.2. @Log4j2

Мы можем использовать аннотацию @Log4j2 для непосредственного использования Log4j2. Итак, мы вносим простое изменение в Lombok Logging Controller для использования @Log4j2 вместо @Slf4j или @Commonsblog :

@RestController
@Log4j2
public class LombokLoggingController {
 
    @RequestMapping("/lombok")
    public String index() {
        log.trace("A TRACE Message");
        log.debug("A DEBUG Message");
        log.info("An INFO Message");
        log.warn("A WARN Message");
        log.error("An ERROR Message");
 
        return "Howdy! Check out the Logs to see the output...";
    }
}   

Помимо ведения журнала, есть и другие аннотации с Ломбока, которые помогают поддерживать наш код в чистоте и порядке. Более подробная информация о них доступна во Введении в проект Lombok , а также у нас есть учебник по настройке Lombok с Eclipse и IntelliJ .

8. Остерегайтесь ведения журнала Java Util

Spring Boot также поддерживает ведение журнала JDK через файл конфигурации logging.properties .

Однако бывают случаи, когда использовать его не очень хорошая идея. Из документации :

Существуют известные проблемы с загрузкой классов при протоколировании Java Util, которые вызывают проблемы при запуске из “исполняемого jar”. Мы рекомендуем вам избегать этого при запуске из “исполняемого файла”, если это вообще возможно.

Это также хорошая практика при использовании Spring 4 для ручного исключения commons-logging in pom.xml, чтобы избежать возможных столкновений между библиотеками ведения журнала. Spring 5 вместо этого обрабатывает его автоматически, поэтому нам не нужно ничего делать при использовании Spring Boot 2.

9. ЯНСИ на Windows

В то время как операционные системы на базе Unix, такие как Linux и Mac OS X, по умолчанию поддерживают цветовые коды ANSI, на консоли Windows все будет, к сожалению, монохромным.

Windows может получать цвета ANSI через библиотеку под названием JANSI.

Однако мы должны обратить внимание на возможные недостатки загрузки классов.

Мы должны импортировать и явно активировать его в конфигурации следующим образом:

Логбэк :


    
        true
        
            [%thread] %highlight(%-5level) %cyan(%logger{15}) - %msg %n
        
    
    

Log4j2 :

Escape-последовательности ANSI поддерживаются изначально на многих платформах, но не по умолчанию в Windows. Чтобы включить поддержку ANSI, добавьте jar Jansi в наше приложение и установите свойство log4j.skipJansi в false . Это позволяет Log4j использовать Jansi для добавления escape-кодов ANSI при записи в консоль.

Примечание: До Log4j 2.10 Jansi был включен по умолчанию. Тот факт, что Janis требует собственного кода, означает, что Janis может быть загружен только одним загрузчиком классов . Для веб-приложений это означает, что jar Jansi должен находиться в пути к классу веб-контейнера. Чтобы избежать проблем с веб-приложениями, Log4j больше не пытается автоматически загружать Jansi без явной конфигурации начиная с Log4j 2.10.

Это также стоит отметить:

  • Страница layout documentation содержит полезную информацию Log4j2 JANSI в разделе highlight{pattern}{style} .
  • В то время как JANSI может раскрасить вывод, баннер Spring Boot (родной или настроенный через banner.txt файл) останется монохроматическим.

10. Заключение

Мы рассмотрели основные способы взаимодействия с основными фреймворками ведения журнала в рамках проекта Spring Boot.

Мы также изучили основные преимущества и подводные камни каждого решения.

Как всегда, полный исходный код доступен на GitHub .