В журнале Spring Boot используются различные позы, пора внести ясность!

Spring Boot Java
В журнале Spring Boot используются различные позы, пора внести ясность!

@[toc] Я записал видео, прежде чем поделиться с вами проблемой журнала Spring Boot, но я всегда чувствовал, что это почти бессмысленно, поэтому Сонгге планировал передать еще одну статью, чтобы обсудить с вами проблему журнала в Java. проблема с журналом в Spring Boot, скажите четко.

1. Обзор журналов Java

Когда дело доходит до журналов Java, многие новички могут быть сбиты с толку, потому что здесь задействовано так много вещей:Apache Commons Logging,Slf4j,Log4j,Log4j2,Logback,Java Util LoggingПодождите, какую роль играют эти рамки? В чем разница между ними?

1.1 Общий обзор

Следующая картинка — хороший пример системы логирования в Java:

Как видите, фреймворки ведения журналов в Java в основном делятся на две категории:бревенчатый фасадиреализация журнала.

бревенчатый фасад

Фасад журнала определяет набор спецификаций интерфейса журнала, он не обеспечивает лежащую в основе конкретную логику реализации.Apache Commons LoggingиSlf4jпопадает в эту категорию.

реализация журнала

Реализация журнала — это конкретная реализация журнала, включая управление уровнем журнала, формат печати журнала, форму вывода журнала (вывод в базу данных, вывод в файл, вывод в консоль и т. д.).Log4j,Log4j2,Logbackа такжеJava Util Loggingпопадает в эту категорию.

Отделение фасада журнала от реализации журнала на самом деле является типичным режимом фасада. Этот метод позволяет конкретным предприятиям свободно переключаться между различными средами реализации журнала без изменения кода. Разработчикам нужно только освоить API фасада журнала. Вот и все.

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

Так можно ли использовать фреймворк ведения журнала отдельно?

Технически это, конечно, хорошо, но мы, как правило, этого не делаем, потому что это плохо обслуживается и потом не так просто расширять. Например, A разработал набор инструментов для использования Log4j для печати журналов, а B ссылается на этот набор инструментов, но B предпочитает использовать Logback для печати журналов.В настоящее время бизнес будет использовать две или даже несколько структур журналов, а разработчики также необходимо поддерживать несколько структур журналов.Файл конфигурации журнала. Поэтому все мы используем бревенчатый фасад для печати логов.

1.2 Уровни журнала

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

Java Util Logging

Java Util LoggingОпределено семь уровней журнала, от серьезного до нормального:

  • SEVERE
  • WARNING
  • INFO
  • CONFIG
  • FINE
  • FINER
  • FINEST

Поскольку уровень по умолчанию — INFO, журналы ниже уровня INFO не будут распечатываться.

Log4j

Log4jОпределено 8 уровней логирования (кроме OFF и ALL, которые, можно сказать, делятся на 6 уровней), от серьезного до нормального:

  • OFF: Самый высокий уровень, используемый для отключения всей регистрации.
  • FATAL: серьезная ошибка, этот уровень может напрямую остановить программу.
  • ОШИБКА: вывод информации об ошибках и исключениях. Если вы не хотите выводить слишком много журналов, вы можете использовать этот уровень.
  • ПРЕДУПРЕЖДЕНИЕ: предупреждение.
  • ИНФОРМАЦИЯ: используется для вывода некоторой важной информации о программе, работающей в производственной среде, и ею нельзя злоупотреблять.
  • DEBUG: используется для печати некоторой текущей информации во время разработки.
  • TRACE
  • ALL Самый низкий уровень, используемый для включения всех журналов.

Logback

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

  • ERROR
  • WARN
  • INFO
  • DEBUG
  • TRACE

1.3 Всестороннее сравнение

Java Util Loggingсистема вJVMФайл конфигурации считывается при запуске и инициализируется, и после запуска приложения конфигурацию нельзя изменить. Кроме того, такая конфигурация реализации журнала также неудобна и может использоваться только вJVMПередайте параметры при запуске, например:

-Djava.util.logging.config.file=<config-file-name>。

В связи с этими ограничениямиJava Util LoggingШироко не используется.

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

Log4jможет иApache Commons LoggingДля использования с,Apache Commons Loggingбудет автоматически искать и использоватьLog4j, если не найденоLog4j, повторное использованиеJava Util Logging.

СравниватьLog4j + Apache Commons LoggingСочетание еще более привлекательноеSlf4j + Logbackкомбинация.

LogbackдаSlf4jСобственная структура реализации , которая также исходит отLog4jавтором (Ceki Gülcü), но по сравнению сLog4j, у него больше преимуществ, возможностей и более высокая производительность.

1.4 Лучшие практики

  • Если вы не хотите добавлять какие-либо зависимости, используйтеJava Util LoggingИли интерфейс ведения журнала, уже предоставленный контейнером фреймворка.
  • Если вас беспокоит производительность, мы рекомендуем:Slf4j + Logback.
  • Если проект уже использовалLog4jПроблем с производительностью не обнаружено, рекомендуемая комбинация:Slf4j + Log4j2.

2. Реализация журнала Spring Boot

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

Реализация ведения журнала Spring Boot по умолчанию:Logback. Это хороший вид: просто запустите проект Spring Boot и найдите строку журнала из консоли, например следующую:

Учитывая, что последний prod — вариативный символ, ищем глобально в проекте:The following profiles are active, результат следующий:

debug в строке вывода журнала. Затем снова запустите проект, как показано ниже:

На данный момент мы видим, что реальная реализация журналаLogback.

другие, такие какJava Util Logging,Log4jДругие фреймворки, Spring Boot также имеют хорошую поддержку.

В проекте Spring Boot, если добавляются следующие веб-зависимости, зависимости журналов добавляются автоматически:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

2.1 Конфигурация журнала Spring Boot

Система ведения журналов Spring Boot автоматически выберет соответствующую конфигурацию журнала на основе содержимого пути к классам, и в этом процессе предпочтение отдается Logback.

Если разработчикам необходимо изменить уровень журнала, им нужно только передать файл application.properties.logging.level 前缀+包名Вы можете настроить его в виде, например, следующего:

logging.level.org.springframework.web=debug
logging.level.org.hibernate=error

Если вы хотите вывести журнал в файл, вы можете указать имя файла журнала, настроив его следующим образом:

logging.file.name=javaboy.log

logging.file.name может указывать только имя файла журнала или полный путь к файлу журнала, например:

logging.file.name=/Users/sang/Documents/javaboy/javaboy.log

Если вы просто хотите переопределить путь к выходному файлу журнала, вы также можете использоватьlogging.file.pathсвойства следующим образом:

logging.file.path=/Users/sang/Documents/javaboy

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

  • logging.logback.rollingpolicy.file-name-pattern: имя файла архива журнала.После того как файл журнала достигает определенного размера, он автоматически сжимается и архивируется.
  • logging.logback.rollingpolicy.clean-history-on-start: следует ли выполнять управление архивом при запуске приложения.
  • logging.logback.rollingpolicy.max-file-size: Верхний предел размера файла журнала.По достижении верхнего предела он будет автоматически сжат.
  • logging.logback.rollingpolicy.total-size-cap: максимальный размер файла журнала до его удаления.
  • logging.logback.rollingpolicy.max-history: количество дней для хранения файлов журнала.

Для архивации лог-файла, если вам интересно, вы можете попробовать сами.Вы можете сначала настроить атрибут max-file-size на меньший размер, чтобы вы могли легко увидеть эффект:

logging.logback.rollingpolicy.max-file-size=1MB

Затем добавьте следующий интерфейс:

@RestController
public class HelloController {
    private static final Logger logger = getLogger(HelloController.class);
    @GetMapping("/hello")
    public void hello() {
        for (int i = 0; i < 100000; i++) {
            logger.info("hello javaboy");
        }
    }
}

Получив доступ к этому интерфейсу, вы увидите, что окончательный сгенерированный файл журнала автоматически сжимается:

Группировку журналов также можно настроить в application.properties.

Группировка журналов может объединять связанные регистраторы в группу для унифицированного управления.

Например, мы можем определить группу tomcat:

logging.group.tomcat=org.apache.catalina,org.apache.coyote, org.apache.tomcat

Затем единообразно управляйте всеми регистраторами в группе tomcat:

logging.level.tomcat=TRACE

Spring Boot также предопределил две группы журналов web и sql следующим образом:

Однако в application.properties можно реализовать только некоторые очень простые конфигурации журналов. Если вы хотите реализовать более детализированные конфигурации журналов, вам необходимо использовать собственную конфигурацию, реализованную журналами, напримерLogbackизclasspath:logback.xml,Log4jизclasspath:log4j.xmlЖдать. Если эти файлы конфигурации ведения журнала существуют в пути к классам, Spring Boot автоматически загрузит эти файлы конфигурации по умолчанию.

2.2 Конфигурация журнала

2.2.1 Базовая конфигурация

дефолтLogbackСуществует два имени файла конфигурации:

  • logback.xml: этот файл конфигурации будет загружен непосредственно фреймворком ведения журнала.
  • logback-spring.xml: этот файл конфигурации не будет загружен непосредственно платформой ведения журнала, но будет проанализирован Spring Boot.Вы можете использовать расширенную функцию профиля Spring Boot.

В Spring Boot этоLogbackПредоставляются четыре файла конфигурации по умолчанию, расположенные по адресуorg/springframework/boot/logging/logback/, соответственно:

  • defaults.xml: содержит общую конфигурацию журнала, правила вывода журнала и т. д.
  • console-appender.xml: добавьте ConsoleAppender с CONSOLE_LOG_PATTERN.
  • file-appender.xml: добавьте RollingFileAppender.
  • base.xml: предоставляется для совместимости со старыми версиями Spring Boot.

Если вам нужно настроитьlogback.xmlфайл, вы можете использовать эти файлы конфигурации по умолчанию при настройке или нет. типичныйlogback.xmlФайл выглядит следующим образом (resources/logback.xml):

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <include resource="org/springframework/boot/logging/logback/defaults.xml"/>
    <include resource="org/springframework/boot/logging/logback/console-appender.xml" />
    <root level="INFO">
        <appender-ref ref="CONSOLE" />
    </root>
    <logger name="org.springframework.web" level="DEBUG"/>
</configuration>

Файлы конфигурации, уже предоставленные Spring Boot, можно импортировать с помощью include или настроить.

2.2.2 Вывод в файл

Если мы хотим подавить вывод журнала консоли и вместо этого выводить содержимое журнала в файл, мы можем настроитьlogback-spring.xmlфайл и импортировать ранее упомянутыйfile-appender.xmlдокумент.

как ниже(resources/logback-spring.xml):

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <include resource="org/springframework/boot/logging/logback/defaults.xml" />
    <property name="LOG_FILE" value="${LOG_FILE:-${LOG_PATH:-${LOG_TEMP:-${java.io.tmpdir:-/tmp}}/}spring.log}"/>
    <include resource="org/springframework/boot/logging/logback/file-appender.xml" />
    <root level="INFO">
        <appender-ref ref="FILE" />
    </root>
</configuration>

2.3 Конфигурация Log4j

если он существует в пути к классамLog4j2Зависимости, Spring Boot автоматически настроит их.

Конечно, по умолчанию его нет в пути к классам.Log4j2зависимости, если вы хотите использоватьLog4j2, который может исключить существующиеLogback, а затем импортироватьLog4j2,следующее:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-logging</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>

Log4j2Конфигурация проще.Создайте новый файл log4j2.xml в каталоге ресурсов со следующим содержимым:

<?xml version="1.0" encoding="UTF-8"?>
<configuration status="warn">
    <properties>
        <Property name="app_name">logging</Property>
        <Property name="log_path">logs/${app_name}</Property>
    </properties>
    <appenders>
        <console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="[%d][%t][%p][%l] %m%n" />
        </console>
        <RollingFile name="RollingFileInfo" fileName="${log_path}/info.log"
                     filePattern="${log_path}/$${date:yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log.gz">
            <Filters>
                <ThresholdFilter level="INFO" />
                <ThresholdFilter level="WARN" onMatch="DENY"
                                 onMismatch="NEUTRAL" />
            </Filters>
            <PatternLayout pattern="[%d][%t][%p][%c:%L] %m%n" />
            <Policies>
                <TimeBasedTriggeringPolicy interval="1" modulate="true" />
                <SizeBasedTriggeringPolicy size="2 MB" />
            </Policies>
            <DefaultRolloverStrategy compressionLevel="0" max="10"/>
        </RollingFile>
        <RollingFile name="RollingFileWarn" fileName="${log_path}/warn.log"
                     filePattern="${log_path}/$${date:yyyy-MM}/warn-%d{yyyy-MM-dd}-%i.log.gz">
            <Filters>
                <ThresholdFilter level="WARN" />
                <ThresholdFilter level="ERROR" onMatch="DENY"
                                 onMismatch="NEUTRAL" />
            </Filters>
            <PatternLayout pattern="[%d][%t][%p][%c:%L] %m%n" />
            <Policies>
                <TimeBasedTriggeringPolicy interval="1" modulate="true" />
                <SizeBasedTriggeringPolicy size="2 MB" />
            </Policies>
            <DefaultRolloverStrategy compressionLevel="0" max="10"/>
        </RollingFile>

        <RollingFile name="RollingFileError" fileName="${log_path}/error.log"
                     filePattern="${log_path}/$${date:yyyy-MM}/error-%d{yyyy-MM-dd}-%i.log.gz">
            <ThresholdFilter level="ERROR" />
            <PatternLayout pattern="[%d][%t][%p][%c:%L] %m%n" />
            <Policies>
                <TimeBasedTriggeringPolicy interval="1" modulate="true" />
                <SizeBasedTriggeringPolicy size="2 MB" />
            </Policies>
            <DefaultRolloverStrategy compressionLevel="0" max="10"/>
        </RollingFile>
    </appenders>
    <loggers>
        <root level="info">
            <appender-ref ref="Console" />
            <appender-ref ref="RollingFileInfo" />
            <appender-ref ref="RollingFileWarn" />
            <appender-ref ref="RollingFileError" />
        </root>
    </loggers>
</configuration>

Имя приложения и расположение файла журнала сначала указываются в узле свойств.

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

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

3. Резюме

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

Наконец, Songge также собрал более 50 документов с требованиями к проекту, друзья, которые хотят участвовать в проекте, чтобы практиковать свои навыки, могут захотеть взглянуть ~

Адрес документа с требованиями:git ee.com/Len VE/Java's…