Spring Boot с нуля 4_ Ведение журнала и сведения о его настройке

Spring Boot

Эта статья принадлежит к оригиналу, перепечатайте и укажите источник, добро пожаловать, чтобы обратить внимание на апплет WeChat小白AI博客Публичный аккаунт WeChat小白AIили сайтxiaobaiai.net

[TOC]

0 Предисловие

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

1 существительное термин

Нам по-прежнему необходимо знать соответствующие базовые знания, которые помогают понять содержание текста.

существительное термин Парафраз
Apache Common Logging Как проект с открытым исходным кодом в Apache, цель commons-logging состоит в том, чтобы предоставить унифицированный интерфейс для «всех реализаций журнала Java», чтобы отделить проект от инструментов реализации журнала; commons-logging и log4j являются проектами с открытым исходным кодом в Apache. Целью commons-logging является предоставление унифицированного интерфейса для «всех реализаций журналов Java», чтобы отделить проект от инструмента реализации журнала.Его собственная функция журнала относительно слаба (только простой SimpleLog), поэтому обычно она не используется сама по себе. .это.
Log4j / Log4j 2 Проект с открытым исходным кодом под Apache, Log4j очень мощный и в настоящее время является самым популярным инструментом ведения журналов Java. Log4j 2.0 представляет новую систему плагинов, поддержку свойств, поддержку конфигурации на основе JSON и автоматическую перезагрузку конфигурации. По сравнению с предыдущей версией Log4j 1.x производительность была значительно улучшена. Он поддерживает многие существующие платформы ведения журналов, включая SLF4J, Commons Logging, Apache Flum, Log4j 1.x, и предоставляет новые API-интерфейсы для программистов.
Java Util Logging Собственная инфраструктура ведения журналов Java
Logback Это платформа ведения журналов, разработанная для замены Log4j, улучшенной версии Log4j, которая имеет больше функций, чем Log4j, а также значительно повышает производительность. Но производительность не так хороша, как у Log4j 2.
SLF4J Как и Apache Common Logging, это также набор интерфейсов.Сейчас популярная комбинация фреймворка и интерфейса — это Commons Logging плюс Log4j, SLF4J плюс Logback, slf4j + log4j2.
Mockito Mockito — это фреймворк общего назначения, который можно использовать для модульного тестирования, особенно классов, разработанных с учетом внедрения зависимостей. Mockito также можно использовать для тестирования контроллеров Spring, но не для целевой поддержки.
MockMVC MockMVC — это сопутствующий продукт для среды Spring, который помогает тестировать контроллеры Spring. MockMVC более конкретен и может быть гораздо менее общим, чем Mockito, но он лучше подходит для тестирования Restful API в Spring MVC.

2 регистрация

Spring BootиспользоватьApache Commons LoggingИнтерфейс записывает все внутренние журналы.Spring Bootпара конфигурации по умолчаниюJava Util Logging,Log4j2а такжеLogbackПоддерживается использование регистраторов. если вы используетеSpring Boot Starters, который используется по умолчаниюLogbackОн обеспечивает хорошую поддержку для ведения журнала. Далее мы объясним, как вести журнал и настраивать различные регистраторы в нескольких частях.Spring BootТребуется только некоторая простая конфигурация для поддержки различных журналов.

2.1 Журнал нулевой конфигурации по умолчанию

Ведение журнала запуска по умолчанию выполняетсяspring-boot-starter-loggingЗависимость определяется и настраивается автоматически, что позволяет использовать любой поддерживаемый регистратор (Java Util Logging, Log4J2 и Logback) в соответствии с предоставленной конфигурацией, хотя мы не предоставляем никакой конфигурации, связанной с ведением журнала, мы по-прежнему можем видеть распечатки журнала на консоли, это это потому чтоSpring bootиспользовалLogbackПредусмотрена поддержка ведения журнала по умолчанию. Но почему мы не увидели его в предыдущей статье?pom.xmlфайл импортированspring-boot-starter-loggingА как быть с этой зависимостью?

Spring BootВнутренний журнал должен использоватьApache Commons Loggingинтерфейс, поэтому это единственная обязательная зависимость. существуетSpring boot1.xКогда нам все еще нужно импортировать вручную, но когдаSpring boot2.x, который импортируется косвенно, т.е. мы зависим отspring-boot-starter-webэта зависимость, это зависит отspring-boot-starter-loggingВ настоящее время импортируется функция регистрации. отSTSЗависимости файла pom.xml можно расширить, чтобы увидеть:

следовательно,Spring bootАвтоматическая настройка обеспечивает использованиеLogbackведение журнала по умолчанию, а конфигурация параметров для ведения журнала по умолчанию предоставляется в этих файлах конфигурации. отSpring BootИсходный код ведения журнала можно увидеть (https://github.com/spring-projects/spring-boot/blob/master/spring-boot-project/spring-boot/src/main/resources/org/springframework/boot/ logging/logback/defaults.xml ).

2.1.1 Печать логов с помощью логгера

Чтобы добавить операторы ведения журнала в код приложения, мы используемSLF4Jв интерфейсеorg.slf4j.Loggerа такжеorg.slf4j.LoggerFactory. Он предоставляет множество полезных методов ведения журнала, а также отделяет реализацию ведения журнала от приложения.

Примечание. Существует много интерфейсов ведения журнала, здесь мы выбираем SLF4J API. И apache.logging/java.util.logging и т. д.

// 使用Log4j2则使用apache logging接口
// import org.apache.logging.log4j.LogManager;
// import org.apache.logging.log4j.Logger; 

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
 
@SpringBootApplication
public class Application 
{
    private static final Logger LOGGER=LoggerFactory.getLogger(Test02HelloworldApplication.class);
 
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
         
        LOGGER.info("简单的日志记录测试 :  {}  + {}  =  {}", 1, 2, 3);
    }
}

Консоль печатает следующим образом:

2019-10-29 21:37:39.818  INFO 16244 --- [           main] c.xiaobaiai.Test02HelloworldApplication  : 简单的日志记录测试 :  1  + 2  =  3

2.1.2 Уровень логирования регистратора

LogbackНастройки поддержкиERROR,WARN,INFO,DEBUG,TRACEилиOFFВ качестве уровня ведения журнала подавляйте приоритет по журналу от высокого к низкому. По умолчанию уровень ведения журнала установлен наINFO. это означаетDEBUGа такжеTRACEСообщение не видно.

включитьDEBUGилиTRACEуровень ведения журнала, мы можемapplication.propertiesУстановите уровень ведения журнала в файле. В качестве альтернативы мы также можем передать командную строку при запуске приложения.--debugили--traceпараметр.

# In application.properties file
# 方法一: 该属性置为true的时候,核心Logger(包含嵌入式容器、hibernate、spring)会输出更多内容,但是你自己应用的日志并不会输出DEBUG级别的日志
debug=true
# 方法二:将日志记录级别应用于特定的软件包。
logging.level.com.xiaobaiai=DEBUG
logging.level.org.springframework=ERROR
logging.level.root=DEBUG

# In Console
$ java -jar target/xx-app-0.0.1-SNAPSHOT.jar --trace

ПРИМЕЧАНИЕ. Если уровень журнала пакета определяется несколько раз с разными уровнями журнала, будет использоваться самый низкий уровень. TRACE — самый низкий уровень, а ERROR — самый высокий.

2.1.3 Формат регистрации регистратора

Формат журнала по умолчанию:Spring BootрегистраторLogbackисходный файлdefault.xmlможно увидеть в:

<property name="CONSOLE_LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-%clr(%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
<property name="FILE_LOG_PATTERN" value="${FILE_LOG_PATTERN:-%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}} ${LOG_LEVEL_PATTERN:-%5p} ${PID:- } --- [%t] %-40.40logger{39} : %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>

Наконец, журнал выводит следующую информацию:

  • Дата и время: миллисекундная точность для легкой сортировки
  • Уровень журнала: ERROR, WARN, INFO, DEBUG или TRACE.
  • Идентификатор процесса
  • ---Разделитель используется для различения начала фактического сообщения журнала.
  • Название темы: заключено в квадратные скобки (может быть усечено для вывода в консоль)
  • имя: обычно это имя класса (обычно сокращенное)
  • Наконец, тело сообщения журнала

Чтобы определить окончательный формат вывода журнала, используйтеlogging.pattern.consoleа такжеlogging.pattern.fileАтрибуты.

# Logging pattern for the console
# 不支持JDK Logger
logging.pattern.console= %d{yyyy-MM-dd HH:mm:ss} - %logger{36} - %msg%n
  
# Logging pattern for file
# 不支持JDK Logger
logging.pattern.file= %d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%

2.1.4 Вывод журнала в файл

по умолчанию,Spring bootЖурналы выводятся только на консоль. Если вы хотите включить ведение журнала файлов, вы можете использовать простое свойствоlogging.fileилиlogging.pathЛегко сделать.

# 输出到指定路径,默认文件名为spring.log
logging.file.path=C:\\Work\\sts4\\test_02_helloworld\\logs
# 文件名设置,使用了该项配置,则会覆盖path设置,直接在工程当前目录下生成日志
logging.file.name=logfilename.log
# 路径与文件名结合(该配置项已被遗弃)
logging.file=${logging.file.path}/log.log
# 输出到文件最大内容限制大小,达到最大后,会截断
# 默认是10M,而且该设置项只对默认的Logback有效,单位GB/MB/KB等
logging.file.max-size = 10MB

2.1.5 Цветовой вывод журнала

Если ваш терминал поддерживает ANSI, настройка цветного вывода сделает журнал более читабельным. вapplication.propertiesустановить вspring.output.ansi.enabledпараметры для поддержки.

# NEVER:禁用ANSI-colored输出(默认项)
# DETECT:会检查终端是否支持ANSI,是的话就采用彩色输出(推荐项)
# ALWAYS:总是使用ANSI-colored格式输出,若终端不支持的时候,会有很多干扰信息,不推荐使用
spring.output.ansi.enabled=DETECT

2.1.6 Пользовательская конфигурация журнала

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

  • Logback:logback-spring.xml, logback-spring.groovy, logback.xml, logback.groovy,logback-spring-xxx.xml
  • 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имя файла в качестве конфигурации ведения журнала (например, с помощьюlogback-spring.xml, вместоlogback.xml), по имениlogback-spring.xmlФайл конфигурации журнала, для которого Spring boot может добавить некоторыеSpring bootУникальные элементы конфигурации.

Вышеуказанное является соглашением об именах по умолчанию и помещено вsrc/main/resourcesСледующее может быть.

Если вам нужен полный контроль над конфигурацией ведения журнала, но вы не хотите использоватьlogback.xmlКак имя конфигурации Logback, его можно найти вapplication.propertiesчерез конфигурационный файлlogging.configАтрибут указывает пользовательское имя:

logging.config=classpath:logging-config.xml

Вот краткое описаниеLogbackПользовательская конфигурация , подробности см. в официальной документации.войти обратно.QoS.eat/manual/conf…

Основные функции конфигурационного файла:

  • Консоль и сохранение журнала в файл настроены
  • Управляет уровнем журнала консоли
  • Параметры разделения обработки для вывода в файлы, включая размер одного файла журнала, все ограничения размера файла журнала и количество дней для хранения журнала.
  • Задан способ именования вывода лога в файл
  • Управляет уровнем вывода журнала указанного пакета.
<?xml version="1.0" encoding="UTF-8"?>
<!-- scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。 
    当scan为true时,此属性生效。默认的时间间隔为1分钟。 debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 -->
<configuration scan="true" scanPeriod="60 seconds"
    debug="false">
    <!-- 每个logger都关联到logger上下文,默认上下文名称为“default”。 但可以使用contextName标签设置成其他名字,用于区分不同应用程序的记录,如打印日志如下中xiaobaiai 
        10:39:28.964 xiaobaiai [main] DEBUG c.x.Test02HelloworldApplication - 简单的日志记录测试 
        : 1 + 2 = 3 -->
    <contextName>xiaobaiai</contextName>

    <!-- property用来定义变量值的标签,property标签有两个属性,name和value;其中name的值是变量的名称,value的值时变量定义的值 
        这里定义了log.path这个变量,下面会有引用这个变量 -->
    <property name="log.path"
        value="/Users/Ethanm/Documents/spring-log" />

    <!--输出到控制台 -->
    <appender name="console"
        class="ch.qos.logback.core.ConsoleAppender">
        <!-- 定义过滤器,ERROR级别 -->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>INFO</level>
        </filter>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %contextName %magenta([%thread]) %highlight(%-5level) %logger{36}.%M - %msg%n</pattern>
        </encoder>
    </appender>

    <!--输出到文件 -->
    <appender name="file"
        class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 最新的log文件 -->
        <file>${log.path}/log_newest.log</file>
        <encoder>
            <!-- %d-以SimpleDateFormat允许的格式输出日志消息发生的时间 %thread-输出发生日志消息的线程的名称。 $-5level-输出日志消息的日志记录级别。 
                %logger{36}-输出发生日志消息的包+类名。括号内的数字表示包+类名的最大长度。 %M-输出发生日志消息的方法的名称(性能较差,不建议生成环境使用) 
                %msg-输出实际的日志消息 %magenta()-将括号中包含的输出的颜色设置为洋红色(其他颜色可用)。 %highlight()-将括号中包含的输出颜色设置为取决于日志记录级别(例如ERROR 
                = red) -->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %magenta([%thread]) %highlight(%-5level) %logger{36}.%M - %msg%n</pattern>
        </encoder>
        <!-- 日志文件分割设置 -->
        <rollingPolicy
            class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>
                ${log.path}/log_%d{yyyy-MM-dd}_%i.log
            </fileNamePattern>
            <maxFileSize>3KB</maxFileSize>
            <!-- 只保存最近10天日志 -->
            <maxHistory>10</maxHistory>
            <!-- 定义日志文件上限,如果所有日志超过这个大小,则会删除旧的日志 -->
            <totalSizeCap>100MB</totalSizeCap>
        </rollingPolicy>
    </appender>

    <!-- root是根logger,不能有name和additivity属性,是有一个level -->
    <!-- appender是一个日志打印的组件,这里组件里面定义了打印过滤的条件、打印输出方式、滚动策略、编码方式、打印格式等 如果我们不使用一个logger或者root的appender-ref指定某个具体的appender时,它就不会生效 -->
    <root level="info">
        <appender-ref ref="console" />
        <appender-ref ref="file" />
    </root>

    <!-- logger标记用来设置某一个包或者具体的某一个类的日志打印级别以及指定appender -->
    <logger name="com.xiaobaiai" level="WARN" additivity="false">
        <appender-ref ref="console" />
    </logger>
</configuration>

2.2 Ведение журнала Log4j2

2.2.1 Знакомство с Log4j2

Использование ведения журнала по умолчаниюLogback, сначала нам нужноpom.xmlудалено изLogback, импортLog4j2.

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <exclusions>
        <!-- 用exclusion排除掉默认日志记录器Logback -->
        <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>

2.2.2 Добавить файл конфигурации log4j2

а такжеLogbackАналогичным образом, добавление следующих файлов конфигурации в папку ресурсов (resources) может быть просканировано:

  • log4j2-spring.xml
  • log4j2.xml

Настройки профиля сLogbackПочти такой же:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN" monitorInterval="30">
    <Properties>
        <Property name="LOG_PATTERN">%d{yyyy-MM-dd'T'HH:mm:ss.SSSZ} %p %m%n</Property>
        <Property name="APP_LOG_ROOT">c:/temp</Property>
    </Properties>
    <Appenders>
        <Console name="console" target="SYSTEM_OUT">
            <PatternLayout pattern="${LOG_PATTERN}" />
        </Console>
  
        <RollingFile name="file"
            fileName="${APP_LOG_ROOT}/SpringBoot2App/application.log"
            filePattern="${APP_LOG_ROOT}/SpringBoot2App/application-%d{yyyy-MM-dd}-%i.log">
            <PatternLayout pattern="${LOG_PATTERN}" />
            <Policies>
                <SizeBasedTriggeringPolicy size="19500KB" />
            </Policies>
            <DefaultRolloverStrategy max="1" />
        </RollingFile>
  
    </Appenders>
    <Loggers>
        <Root level="info">
            <AppenderRef ref="console" />
            <AppenderRef ref="file" />
        </Root>
    </Loggers>
</Configuration>

2.3 Настройки журнала встроенного веб-сервера

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

#tomcat
server.tomcat.basedir=C:/temp/logs
server.tomcat.accesslog.enabled=true
server.tomcat.accesslog.pattern=%t %a "%r" %s (%D ms)
logging.level.org.apache.tomcat=DEBUG
logging.level.org.apache.catalina=DEBUG
 
#undertow
server.undertow.accesslog.directory=C:/temp/logs
server.undertow.accesslog.enabled=true
server.undertow.accesslog.pattern=%t %a "%r" %s (%D ms)
logging.level.io.undertow.server=DEBUG
logging.level.io.undertow.websockets=DEBUG 
 
#jetty
server.jetty.accesslog.filename=/var/log/jetty-access.log
server.jetty.accesslog.enabled=true
logging.level.org.eclipse.jetty=INFO
logging.level.org.eclipse.jetty.websocket=DEBUG

3 Резюме

В этой статье представлен обзор основных интерфейсов ведения журналов.Apache common loggingа такжеSLF4JС пониманием,LogbackдаSpring bootлоггеры настроены по умолчанию вapplication.propertiesКонфигурация, связанная с журналом конфигурации, подробно объясняется, и как настроитьLogbackКонфигурация также подробно описана и, наконец, показано, как переключить регистратор наLog4j2и как настроитьLog4j2Приведены примеры. Раздел расширения также дает простой пример конфигурации журнала встроенного веб-сервера. В заключение мыSpring bootЭтот кусок журнала больше не должен быть незнакомым.

4 Справочные документы

  • http://commons.apache.org/proper/commons-logging/
  • https://www.infoq.com/news/2014/07/apache-log4j2/
  • https://stackify.com/compare-java-logging-frameworks/
  • https://blog.souche.com/logback-log4j-log4j2shi-ce/
  • https://howtodoinjava.com/spring-boot2/logging/spring-boot-logging-configurations/
  • https://www.codingame.com/playgrounds/4497/configuring-logback-with-spring-boot
  • https://howtodoinjava.com/spring-boot2/logging/embedded-server-logging-config/

Эта статья принадлежит к оригиналу, перепечатайте и укажите источник, добро пожаловать, чтобы обратить внимание на CSDNfreeapeили апплет WeChat小白AI博客Публичный аккаунт WeChat小白AIили сайтxiaobaiai.net