Вход в Spring Boot

Вход в Spring Boot

1. обзор

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

Более подробная информация о Logback доступна вA Guide To Logback, а Log4j2 вводится вIntro to Log4j2 – Appenders, Layouts and Filters.

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

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

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

Read more

Отобразить отчет автоконфигурации в Spring Boot

Узнайте, какие компоненты автоматически настраиваются в приложении Spring Boot, сгенерировав отчет автоконфигурации во время запуска.

Read more

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

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

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

@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...";
    }
}

После загрузки веб-приложенияwe’ll be able to trigger those logging lines by simply visiting http://localhost:8080/

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

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

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

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

We shouldn’t worry about importing spring-jcl at all if we’re using a Spring Boot Starter (почти всегда мы). Это потому, что каждый стартер, как и нашspring-boot-starter-web, зависит отspring-boot-starter-logging,, который уже использует для насspring-jcl.

When using starters, Logback is used for logging by default.

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

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

image

Как видно на картинке выше,the default logging level of the Logger is preset to INFO, meaning thatTRACE and DEBUG messages are not visible.

Чтобы активировать их без изменения конфигурации,we can pass the –debug or –trace arguments on the command line:

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

Spring Boot такжеgives us access to a more fine-grained log level setting via environment variables. Есть несколько способов сделать это.

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

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

В качестве альтернативы, если мы используем Maven, мы можемdefine our log settings via the command line:

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

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

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

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

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

Наконец, мы можемchange the logging level permanently by using our logging framework configuration file.

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


Стоит отметить, чтоif the log level for a package is defined multiple times использует различные параметры, упомянутые выше, ноwith different log levels, the lowest level will be used.

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

4. Logback Configuration Logging

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

Давайте посмотримhow to include a Logback configuration с другим цветом и шаблоном ведения журнала, с отдельными спецификациями для выводаconsole иfile и с приличнымrolling policy, чтобы избежать создания огромных файлов журнала.

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

When a file in the classpath has one of the following names, Spring Boot will automatically load it по умолчанию:

  • logback-spring.xml

  • logback.xml

  • logback-spring.groovy

  • logback.groovy

Spring recommends using the -spring variant вместо обычных, когда это возможно, как описаноhere.

Напишем простой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
            
        
    

    
    
        
        
    

    
    
        
        
    

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

 

image

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

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

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

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

In order to use any logging library other than Logback, though, we need to exclude it from our dependencies.

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


    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-spring.xml

  • log4j2.xml

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

Напишем простойlog4j2-spring.xml:



    
        
            
        

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

    
        
        
            
            
        

        
        
    

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

 

image

Как мы видим, вывод сильно отличается от вывода Logback - доказательство того, что сейчас мы полностью используем Log4j2.

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

6. Log4j2 Без SLF4J

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

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

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

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

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

7. Вход с Lombok

В примерах мы виделиso far, we’ve had to declare an instance of a logger из нашего фреймворка. Этот стандартный код может раздражать, и мы можем избежать его, используя различные аннотации, представленные Lombok.

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


    org.projectlombok
    lombok
    1.18.4
    provided

7.1. @Slf4j и@CommonsLog

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

И мы можемuse Lombok’s @Slf4j and @CommonsLog annotations добавить нужный экземпляр регистратора в наш класс:org.slf4j.Logger для SLF4J иorg.apache.commons.logging.Log для ведения журнала Apache Commons.

Чтобы увидеть эти аннотации в действии, давайте создадим класс, аналогичныйLoggingController, но без экземпляра регистратора. Назовем егоLombokLoggingController и аннотируем@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.

СZero-Configuration Logging,the application will use underlying logging implementation Logback для регистрации. Точно так же реализация Log4j2 будет использоваться для регистрации с Log4j2-Configuration Logging.

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

7.2. @Log4j2с

Мы можем использовать аннотацию@Log4j2 для непосредственного использования Log4j2. Следовательно, мы вносим простое изменение вLombokLoggingController, чтобы использовать@Log4j2 вместо@Slf4j или@CommonsLog:

@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, которые помогают поддерживать наш код в чистоте и порядке. Более подробная информация о них доступна вIntroduction to Project Lombok, а также у нас есть руководство поSetting up Lombok with Eclipse and IntelliJ.

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

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

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

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

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

9. JANSI в Windows

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

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

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

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


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

Экранирующие последовательности ANSI изначально поддерживаются на многих платформах, но не поддерживаются в Windows. To enable ANSI support add the Jansi jar to our application and set property log4j.skipJansi to false. Это позволяет Log4j использовать Jansi для добавления управляющих кодов ANSI при записи в консоль.

Note
До Log4j 2.10 Jansi был включен по умолчанию. Тот факт, что Jansi требует нативный код, означает, чтоJansi can only be loaded by a single class loader. Для веб-приложений это означаетthe Jansi jar has to be in the web container’s classpath. Чтобы избежать проблем с веб-приложениями, Log4j больше не будет автоматически загружать Jansi без явной настройки, начиная с Log4j 2.10 и более поздних версий.

Также стоит знать, что:

  • страница документацииlayout содержит полезную информацию Log4j2 JANSI в разделеhighlight{pattern}{style}

  • в то время как JANSI может раскрашивать вывод, баннер Spring Boot (собственный или настраиваемый с помощью файлаbanner.txt) останется монохромным.

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

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

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

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