предисловие
Журналы обычно не рассматриваются отдельно как функция на этапе требований и подробно не рассматриваются в предложении продукта. Однако это не влияет на его важное положение в любой системе.
Сегодня я расскажу, как настроить журналы в Spring Boot.
Весенняя загрузочная версия
Версия Spring Boot, на которой основана эта статья:2.3.4.RELEASE
.
уровень журнала
Несколько общих уровней журнала делятся на:TRACE < DEBUG < INFO < WARN < ERROR < FATAL
.
Как понимать этот уровень логирования? Простой, если уровень логирования в проекте установлен наINFO
, то лог-информация более низкого уровня, чем она, не видна, т.е.TRACE
,DEBUG
Журнал не будет отображаться.
Что такое фреймворки ведения журналов?
Общие структуры ведения журналовlog4j
,logback
,log4j2
.
log4j
Эта структура журнала показывает, что она знакома и часто используется в разработке Spring, но говорят, что log4j больше официально не обновляется, и его производительность лучше, чемlogback
,log4j2
Намного хуже.
logback
Кlog4j
Еще одна платформа ведения журналов с открытым исходным кодом, разработанная основателем, logback улучшила производительность более чем в 10 раз по сравнению с log4j, а начальная загрузка памяти также меньше. Как стандартная среда ведения журналов Spring Boot, она определенно имеет много преимуществ.
log4j2
позже чемlogback
Запущен, официальный сайт представляет коэффициент производительностиlogback
Высокий, но кто знает, если Ван По продает дыни и хвастается. Ходят слухи, что log4j2 скопировал logback во многих идеях. Поэтому, хотя log4j2 является официальным проектом Apache, многие фреймворковые проекты, такие как Spring, не включили его в мейнстрим.Это полностью слухи автора, не принимайте всерьез, это просто отступление.
Фреймворков логов много.Как выбрать подстраиваться под текущую разработку проекта рядовые программисты конечно не рассматривают, но для высших занятий надо как минимум об этом знать, ха-ха.
Фреймворк ведения журналов Spring Boot
Фреймворк ведения журналов Spring Boot по умолчанию:logback
, Поскольку Spring Boot может включать его в систему ведения журнала по умолчанию, должны быть определенные соображения, поэтому не заменяйте его в фактическом процессе разработки.
В принципе, необходимо использовать logback и добавить следующие зависимости, но, поскольку это фреймворк ведения журнала по умолчанию, конечно, нет необходимости повторно вводить зависимости.
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
Уровень журнала по умолчанию в Spring Boot:INFO
, журнал запуска проекта печатается следующим образом:
Как видно из рисунка выше, элементы выходного журнала по умолчанию следующие:
- Время и дата: с точностью до миллисекунд
- Уровень журнала: ERROR, WARN, INFO, DEBUG, TRACE
- Идентификатор процесса
- Разделитель: — Идентифицирует начало фактического журнала.
- Название темы: заключено в квадратные скобки (может обрезать вывод консоли)
- Имя регистратора: обычно используется имя класса исходного кода.
- содержимое журнала
Как журналы используются в коде?
Журналы должны отслеживаться в бизнесе, так как же выводить журналы в своем собственном бизнесе? На самом деле существует два широко используемых метода, которые представлены один за другим ниже.
Первый на самом деле является широко используемым методом давным-давно, просто добавьте в код следующее:
private final Logger logger= LoggerFactory.getLogger(DemoApplicationTests.class);
Этот метод явно безвкусный, не будет ли очень низким добавить его в каждый класс? Не волнуйтесь, Ломбок решил загадку за нас.
Чтобы использовать ломбок, вам нужно добавить следующие зависимости:
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
Он также очень прост в использовании, просто отметьте аннотацию в классе@Slf4j
Вы можете следующим образом:
@Slf4j
class DemoApplicationTests {
@Test
public void test(){
log.debug("输出DEBUG日志.......");
}
}
Как настроить уровень журнала?
Уровень журнала по умолчанию в Spring Boot — INFO, но вы можете настроить уровень журнала самостоятельно следующим образом:
logging.level.root=DEBUG
Вышеупомянутое, чтобы изменить уровень всех журналов наDEBUG
, Spring Boot также поддерживаетpackage
Регулировка уровня логарифмического уровня, в формате:logging.level.xxx=xxx
,следующее:
logging.level.com.example.demo=INFO
Тогда полная конфигурация выглядит следующим образом:
logging.level.root=DEBUG
logging.level.com.example.demo=INFO
Как журнал выводится в файл?
В Spring Boot журнал по умолчанию выводится на консоль, но его невозможно отобразить в производственной среде, поэтому необходимо настроить вывод журнала в файл журнала.
Есть две важные конфигурации:
-
logging.file.path
: указывает путь к файлу журнала. -
logging.file.name
: имя файла журнала, по умолчаниюspring.log
Примечание: В официальной документации сказано, что эти два свойства нельзя настраивать одновременно, иначе они не вступят в силу, поэтому нужно настроить только одно.
Укажите выходной файл в качестве текущего пути к проектуlogs
файл, файл журнала, созданный по умолчанию,spring.log
,следующее:
logging.file.path=./logs
В файле журнала есть и другие атрибуты, такие как максимальный размер файла журнала, количество дней хранения журнала и т. д., которые будут представлены ниже.
Как настроить формат журнала?
Формат лога по умолчанию виден на первом рисунке, иногда нам нужно настроить формат вывода лога, который нам нужен, чтобы мы могли его сразу увидеть при проверке лога.
Существует две конфигурации пользовательского формата журнала: формат вывода консоли и формат вывода журнала в файле:
-
logging.pattern.console
: формат вывода консоли -
logging.pattern.file
: выходной формат файла журнала
Например, конфигурация следующая:
logging.pattern.console=%d{yyyy/MM/dd-HH:mm:ss} [%thread] %-5level %logger- %msg%n
logging.pattern.file=%d{yyyy/MM/dd-HH:mm} [%thread] %-5level %logger- %msg%n
Значения приведенных выше кодов конфигурации следующие:
%d{HH:mm:ss.SSS}——日志输出时间
%thread——输出日志的进程名字,这在Web应用以及异步任务处理中很有用
%-5level——日志级别,并且使用5个字符靠左对齐
%logger- ——日志输出者的名字
%msg——日志消息
%n——平台的换行符
Как настроить конфигурацию ведения журнала?
Официальная документация Spring Boot указывает, что в соответствии с различными системами ведения журнала следующие имена файлов конфигурации журнала могут быть загружены правильно, а именно:
-
Logback
: logback-spring.xml, logback-spring.groovy, logback.xml, logback.groovy -
Log4j
: log4j-spring.properties, log4j-spring.xml, log4j.properties, log4j.xml -
Log4j2
: log4j2-spring.xml, log4j2.xml -
JDK (Java Util Logging)
: logging.properties
Spring Boot официально рекомендует использовать имя файла с параметром -spring в качестве конфигурации журнала. Так что просто нужноsrc/resources
создать папкуlogback-spring.xml
Вот и все, содержимое конфигурационного файла следующее:
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<!-- 定义日志存放目录 -->
<property name="logPath" value="logs"/>
<!-- 日志输出的格式-->
<property name="PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t-%L] %-5level %logger{36} %L %M - %msg%xEx%n"/>
<contextName>logback</contextName>
<!--输出到控制台 ConsoleAppender-->
<appender name="consoleLog" class="ch.qos.logback.core.ConsoleAppender">
<!--展示格式 layout-->
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>${PATTERN}</pattern>
</layout>
<!--过滤器,只有过滤到指定级别的日志信息才会输出,如果level为ERROR,那么控制台只会输出ERROR日志-->
<!-- <filter class="ch.qos.logback.classic.filter.ThresholdFilter">-->
<!-- <level>ERROR</level>-->
<!-- </filter>-->
</appender>
<!--正常的日志文件,输出到文件中-->
<appender name="fileDEBUGLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--如果只是想要 Info 级别的日志,只是过滤 info 还是会输出 Error 日志,因为 Error 的级别高,
所以我们使用下面的策略,可以避免输出 Error 的日志-->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!--过滤 Error-->
<level>Error</level>
<!--匹配到就禁止-->
<onMatch>DENY</onMatch>
<!--没有匹配到就允许-->
<onMismatch>ACCEPT</onMismatch>
</filter>
<!--日志名称,如果没有File 属性,那么只会使用FileNamePattern的文件路径规则
如果同时有<File>和<FileNamePattern>,那么当天日志是<File>,明天会自动把今天
的日志改名为今天的日期。即,<File> 的日志都是当天的。
-->
<File>${logPath}/log_demo.log</File>
<!--滚动策略,按照时间滚动 TimeBasedRollingPolicy-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--文件路径,定义了日志的切分方式——把每一天的日志归档到一个文件中,以防止日志填满整个磁盘空间-->
<FileNamePattern>${logPath}/log_demo_%d{yyyy-MM-dd}.log</FileNamePattern>
<!--只保留最近90天的日志-->
<maxHistory>90</maxHistory>
<!--用来指定日志文件的上限大小,那么到了这个值,就会删除旧的日志-->
<!--<totalSizeCap>1GB</totalSizeCap>-->
</rollingPolicy>
<!--日志输出编码格式化-->
<encoder>
<charset>UTF-8</charset>
<pattern>${PATTERN}</pattern>
</encoder>
</appender>
<!--输出ERROR日志到指定的文件中-->
<appender name="fileErrorLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--如果只是想要 Error 级别的日志,那么需要过滤一下,默认是 info 级别的,ThresholdFilter-->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>Error</level>
</filter>
<!--日志名称,如果没有File 属性,那么只会使用FileNamePattern的文件路径规则
如果同时有<File>和<FileNamePattern>,那么当天日志是<File>,明天会自动把今天
的日志改名为今天的日期。即,<File> 的日志都是当天的。
-->
<File>${logPath}/error.log</File>
<!--滚动策略,按照时间滚动 TimeBasedRollingPolicy-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--文件路径,定义了日志的切分方式——把每一天的日志归档到一个文件中,以防止日志填满整个磁盘空间-->
<FileNamePattern>${logPath}/error_%d{yyyy-MM-dd}.log</FileNamePattern>
<!--只保留最近90天的日志-->
<maxHistory>90</maxHistory>
<!--用来指定日志文件的上限大小,那么到了这个值,就会删除旧的日志-->
<!--<totalSizeCap>1GB</totalSizeCap>-->
</rollingPolicy>
<!--日志输出编码格式化-->
<encoder>
<charset>UTF-8</charset>
<pattern>${PATTERN}</pattern>
</encoder>
</appender>
<!--指定最基础的日志输出级别-->
<root level="DEBUG">
<!--appender将会添加到这个loger-->
<appender-ref ref="consoleLog"/>
<appender-ref ref="fileDEBUGLog"/>
<appender-ref ref="fileErrorLog"/>
</root>
<!-- 定义指定package的日志级别-->
<logger name="org.springframework" level="DEBUG"></logger>
<logger name="org.mybatis" level="DEBUG"></logger>
<logger name="java.sql.Connection" level="DEBUG"></logger>
<logger name="java.sql.Statement" level="DEBUG"></logger>
<logger name="java.sql.PreparedStatement" level="DEBUG"></logger>
<logger name="io.lettuce.*" level="INFO"></logger>
<logger name="io.netty.*" level="ERROR"></logger>
<logger name="com.rabbitmq.*" level="DEBUG"></logger>
<logger name="org.springframework.amqp.*" level="DEBUG"></logger>
<logger name="org.springframework.scheduling.*" level="DEBUG"></logger>
<!--定义com.xxx..xx..xx包下的日志信息不上传,直接输出到fileDEBUGLog和fileErrorLog这个两个appender中,日志级别为DEBUG-->
<logger name="com.xxx.xxx.xx" additivity="false" level="DEBUG">
<appender-ref ref="fileDEBUGLog"/>
<appender-ref ref="fileErrorLog"/>
</logger>
</configuration>
Конечно, если вы не хотите использовать имя, рекомендованное Spring Boot, вы можете настроить его самостоятельно.Вам нужно только указать имя файла конфигурации в файле конфигурации следующим образом:
logging.config=classpath:logging-config.xml
Запутался, что значит куча конфигураций? Не волнуйтесь, давайте представим их один за другим.
узел конфигурации
Это корневой узел со следующими свойствами:
-
scan
: когда для этого свойства установлено значение true, файл конфигурации будет перезагружен, если он изменится, значение по умолчанию — true. -
scanPeriod
: Установите временной интервал для контроля за изменением файла конфигурации.Если единица измерения времени не указана, единицей измерения по умолчанию являются миллисекунды. Это свойство вступает в силу, когда для сканирования установлено значение true. Интервал времени по умолчанию составляет 1 минуту. -
debug
: Когда для этого свойства установлено значение true, внутренняя информация журнала logback будет распечатана, а текущий статус logback будет просматриваться в режиме реального времени. Значение по умолчанию неверно.
корневой узел
Это обязательный узел, используемый для указания базового уровня журнала, существует только одинlevel
свойство, значение по умолчаниюDEBUG
.
Узел может содержать ноль или более элементов, дочерние узлыappender-ref
, отметьте этоappender
будут добавлены в этот регистратор.
узел contextName
Идентифицирует имя контекста, значение по умолчанию — значение по умолчанию, обычно не используется.
узел свойства
Отметьте переменную контекста, атрибуты имеют имя и значение и могут использоваться после определения переменной.${}
чтобы получить.
дополнительный узел
Используется для форматирования узла вывода журнала, есть два свойстваname
а такжеclass
, класс используется для указания, какая стратегия вывода обычно используетсястратегия вывода на консольа такжестратегия вывода файла.
Этот узел очень важен.Обычный файл журнала должен определять три приложения, а именно вывод консоли, вывод обычного файла журнала и вывод файла журнала исключений.
Этот узел имеет несколько важных дочерних узлов, а именно:
-
filter
: Перехватчик вывода логов, если нет особой настройки, то вообще можно использовать тот, что идет в комплекте с системой, но если вы хотите разделить логи, например вывод логов уровня ERROR в файл, то вам будетERROR
Лог уровня выводится в другой файл, и он в это время будет перехвачен.ERROR
лог уровня. -
encoder
: В сочетании с узлом шаблона для определенного формата выходного журнала и кодировки. -
file
: Узел используется для указания выходного местоположения файла журнала, который может быть абсолютным или относительным путем. -
rollingPolicy
: Политика отката журнала, здесь мы используем TimeBasedRollingPolicy, политику отката на основе времени, со следующими подузлами fileNamePattern, необходимый узел, который можно использовать для установки архивов журналов в указанное время. -
maxHistory
: необязательный узел, который управляет максимальным количеством сохраняемых архивных файлов. Если число превышено, старые файлы будут удалены. Например, если установлено значение 30, старые журналы будут удалены через 30 дней. -
totalSizeCap
: необязательный узел, используется для указания верхнего предела размера файла журнала, например, если он установлен в 3 ГБ, то при достижении этого значения старый журнал будет удален
узел регистратора
Необязательный узел для указания уровня вывода журнала пакета, который переопределит корневой уровень вывода. Этот узел имеет несколько важных свойств:
-
name
: указанное имя пакета -
level
: необязательный, уровень журнала -
addtivity
: Необязательно, значение по умолчанию — true, информация этого регистратора передается на верхний уровень, а корневой узел определяет печать журнала. Если установлено значение false, он не будет загружаться, вам нужно определитьappender-ref
узел будет выводить.
Суммировать
Здесь представлены выбор журнала Spring Boot и настройка конфигурации журнала. ! !