@[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…