Обратите внимание на публичный аккаунт WeChat: CodingTechWork, учитесь и развивайтесь вместе.
введение
Для онлайн-программы или службы важно иметь вывод журнала для облегчения работы и обслуживания. Вывод журнала требует определенного планирования, такого как имя журнала, размер журнала и количество файлов, разделенных журналом. В среде Spring мы можем использоватьlog4jЧтобы установить журнал, более высокая версия SpringBoot будет использоватьlog4j2.
вводить
обзор log4j2
Перехват исходных слов официального сайта:Apache Log4j 2 is an upgrade to Log4j that provides significant improvements over its predecessor, Log4j 1.x, and provides many of the improvements available in Logback while fixing some inherent problems in Logback’s architecture.
Log4j на самом деле можно понимать какlog for java, так что это инфраструктура журналов Java, которая предоставляет службы журналов, а Log4j 2 — это обновленная версия Log4j с лучшей производительностью, чемlogbackхорошо.
Приоритет уровня журнала от низкого к высокому:ALL、DEBUG、 INFO、 WARN、 ERROR、FATAL、 OFF. Рекомендуется использовать общий официальный сайтDEBUG、INFO、WARN和ERRORэти четыре, но мы можем добавить одинALLСамый низкий уровень для общего вывода журнала. Чем выше регистрация журнала, тем меньше журналов будет распечатано.
зависимости pom для 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 необходимо исключить зависимость от фреймворка логирования Logback.
<artifactId>spring-boot-starter-logging</artifactId>
- если
1.3.x及以下版本Spring Boot поддерживает толькоlog4jконфигурация журнала.
<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-log4j</artifactId>
</dependency>
путь конфигурации log4j2.xml
log4j2 вообще может пройтиxml,json,yamlилиpropertiesФайлы форм для достижения, мы в основном представляем здесьxmlформат файла.
путь по умолчанию
Введеноlog4j2После зависимости значение по умолчанию находится вsrc/main/resources目录присоединиться кlog4j2.xml配置文件Вы можете настроить журнал, а затем вapplication.ymlНастройте путь доступа в .
Примеры следующие:
- расположение развертывания log4j2.xml
Поместите файл конфигурации в каталог src/main/resources проекта кода. 2. YML-конфигурация
#日志配置 无特殊需求无需更改
logging:
config: classpath:log4j2.xml
level:
root: INFO
javax.activation: info
org.apache.catalina: INFO
org.apache.commons.beanutils.converters: INFO
org.apache.coyote.http11.Http11Processor: INFO
org.apache.http: INFO
org.apache.tomcat: INFO
org.springframework: INFO
com.chinamobile.cmss.bdpaas.resource.monitor: DEBUG
Пользовательское место развертывания
Конечно, мы также можем развернуть в микросервисахconfig/каталог, а затем вapplication.ymlНастройте путь доступа в .
Пример: путь log4j2.xml, настроенный в нашем развертывании micro-service01.
- расположение развертывания log4j2.xml
[userA@linux01 config]$ pwd
/home/userA/SpringBoot/micro-service01/config
[userA@linux01 config]$ ll
total 24
-rwxr-xr-x 1 userA userA 5938 Sep 9 16:30 application.yml
-r-------- 1 userA userA 8342 Sep 8 16:33 log4j2.xml
- YML-конфигурация
#日志配置 无特殊需求无需更改
logging:
config: /home/userA/SpringBoot/micro-service01/config/log4j2.xml
level:
root: INFO
javax.activation: info
org.apache.catalina: INFO
org.apache.commons.beanutils.converters: INFO
org.apache.coyote.http11.Http11Processor: INFO
org.apache.http: INFO
org.apache.tomcat: INFO
org.springframework: INFO
com.chinamobile.cmss.bdpaas.resource.monitor: DEBUG
сведения о конфигурации log4j2.xml
XML-шаблон конфигурации
<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
<!--<Configuration status="WARN" monitorInterval="30"> -->
<properties>
<property name="LOG_HOME">./service-logs</property>
</properties>
<Appenders>
<!--*********************控制台日志***********************-->
<Console name="consoleAppender" target="SYSTEM_OUT">
<!--设置日志格式及颜色-->
<PatternLayout
pattern="%style{%d{ISO8601}}{bright,green} %highlight{%-5level} [%style{%t}{bright,blue}] %style{%C{}}{bright,yellow}: %msg%n%style{%throwable}{red}"
disableAnsi="false" noConsoleNoAnsi="false"/>
</Console>
<!--*********************文件日志***********************-->
<!--all级别日志-->
<RollingFile name="allFileAppender"
fileName="${LOG_HOME}/all.log"
filePattern="${LOG_HOME}/$${date:yyyy-MM}/all-%d{yyyy-MM-dd}-%i.log.gz">
<!--设置日志格式-->
<PatternLayout>
<pattern>%d %p %C{} [%t] %m%n</pattern>
</PatternLayout>
<Policies>
<!-- 设置日志文件切分参数 -->
<!--<OnStartupTriggeringPolicy/>-->
<!--设置日志基础文件大小,超过该大小就触发日志文件滚动更新-->
<SizeBasedTriggeringPolicy size="100 MB"/>
<!--设置日志文件滚动更新的时间,依赖于文件命名filePattern的设置-->
<TimeBasedTriggeringPolicy/>
</Policies>
<!--设置日志的文件个数上限,不设置默认为7个,超过大小后会被覆盖;依赖于filePattern中的%i-->
<DefaultRolloverStrategy max="100"/>
</RollingFile>
<!--debug级别日志-->
<RollingFile name="debugFileAppender"
fileName="${LOG_HOME}/debug.log"
filePattern="${LOG_HOME}/$${date:yyyy-MM}/debug-%d{yyyy-MM-dd}-%i.log.gz">
<Filters>
<!--过滤掉info及更高级别日志-->
<ThresholdFilter level="info" onMatch="DENY" onMismatch="NEUTRAL"/>
</Filters>
<!--设置日志格式-->
<PatternLayout>
<pattern>%d %p %C{} [%t] %m%n</pattern>
</PatternLayout>
<Policies>
<!-- 设置日志文件切分参数 -->
<!--<OnStartupTriggeringPolicy/>-->
<!--设置日志基础文件大小,超过该大小就触发日志文件滚动更新-->
<SizeBasedTriggeringPolicy size="100 MB"/>
<!--设置日志文件滚动更新的时间,依赖于文件命名filePattern的设置-->
<TimeBasedTriggeringPolicy/>
</Policies>
<!--设置日志的文件个数上限,不设置默认为7个,超过大小后会被覆盖;依赖于filePattern中的%i-->
<DefaultRolloverStrategy max="100"/>
</RollingFile>
<!--info级别日志-->
<RollingFile name="infoFileAppender"
fileName="${LOG_HOME}/info.log"
filePattern="${LOG_HOME}/$${date:yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log.gz">
<Filters>
<!--过滤掉warn及更高级别日志-->
<ThresholdFilter level="warn" onMatch="DENY" onMismatch="NEUTRAL"/>
</Filters>
<!--设置日志格式-->
<PatternLayout>
<pattern>%d %p %C{} [%t] %m%n</pattern>
</PatternLayout>
<Policies>
<!-- 设置日志文件切分参数 -->
<!--<OnStartupTriggeringPolicy/>-->
<!--设置日志基础文件大小,超过该大小就触发日志文件滚动更新-->
<SizeBasedTriggeringPolicy size="100 MB"/>
<!--设置日志文件滚动更新的时间,依赖于文件命名filePattern的设置-->
<TimeBasedTriggeringPolicy interval="1" modulate="true />
</Policies>
<!--设置日志的文件个数上限,不设置默认为7个,超过大小后会被覆盖;依赖于filePattern中的%i-->
<!--<DefaultRolloverStrategy max="100"/>-->
</RollingFile>
<!--warn级别日志-->
<RollingFile name="warnFileAppender"
fileName="${LOG_HOME}/warn.log"
filePattern="${LOG_HOME}/$${date:yyyy-MM}/warn-%d{yyyy-MM-dd}-%i.log.gz">
<Filters>
<!--过滤掉error及更高级别日志-->
<ThresholdFilter level="error" onMatch="DENY" onMismatch="NEUTRAL"/>
</Filters>
<!--设置日志格式-->
<PatternLayout>
<pattern>%d %p %C{} [%t] %m%n</pattern>
</PatternLayout>
<Policies>
<!-- 设置日志文件切分参数 -->
<!--<OnStartupTriggeringPolicy/>-->
<!--设置日志基础文件大小,超过该大小就触发日志文件滚动更新-->
<SizeBasedTriggeringPolicy size="100 MB"/>
<!--设置日志文件滚动更新的时间,依赖于文件命名filePattern的设置-->
<TimeBasedTriggeringPolicy/>
</Policies>
<!--设置日志的文件个数上限,不设置默认为7个,超过大小后会被覆盖;依赖于filePattern中的%i-->
<DefaultRolloverStrategy max="100"/>
</RollingFile>
<!--error及更高级别日志-->
<RollingFile name="errorFileAppender"
fileName="${LOG_HOME}/error.log"
filePattern="${LOG_HOME}/$${date:yyyy-MM}/error-%d{yyyy-MM-dd}-%i.log.gz">
<!--设置日志格式-->
<PatternLayout>
<pattern>%d %p %C{} [%t] %m%n</pattern>
</PatternLayout>
<Policies>
<!-- 设置日志文件切分参数 -->
<!--<OnStartupTriggeringPolicy/>-->
<!--设置日志基础文件大小,超过该大小就触发日志文件滚动更新-->
<SizeBasedTriggeringPolicy size="100 MB"/>
<!--设置日志文件滚动更新的时间,依赖于文件命名filePattern的设置-->
<TimeBasedTriggeringPolicy/>
</Policies>
<!--设置日志的文件个数上限,不设置默认为7个,超过大小后会被覆盖;依赖于filePattern中的%i-->
<DefaultRolloverStrategy max="100"/>
</RollingFile>
<!--json格式error级别日志-->
<RollingFile name="errorJsonAppender"
fileName="${LOG_HOME}/error-json.log"
filePattern="${LOG_HOME}/error-json-%d{yyyy-MM-dd}-%i.log.gz">
<JSONLayout compact="true" eventEol="true" locationInfo="true"/>
<Policies>
<SizeBasedTriggeringPolicy size="100 MB"/>
<TimeBasedTriggeringPolicy interval="1" modulate="true"/>
</Policies>
</RollingFile>
</Appenders>
<Loggers>
<!-- 根日志设置 -->
<Root level="debug">
<AppenderRef ref="allFileAppender" level="all"/>
<AppenderRef ref="consoleAppender" level="debug"/>
<AppenderRef ref="debugFileAppender" level="debug"/>
<AppenderRef ref="infoFileAppender" level="info"/>
<AppenderRef ref="warnFileAppender" level="warn"/>
<AppenderRef ref="errorFileAppender" level="error"/>
<AppenderRef ref="errorJsonAppender" level="error"/>
</Root>
<!--spring日志-->
<Logger name="org.springframework" level="debug"/>
<!--druid数据源日志-->
<Logger name="druid.sql.Statement" level="warn"/>
<!-- mybatis日志 -->
<Logger name="com.mybatis" level="warn"/>
<Logger name="org.hibernate" level="warn"/>
<Logger name="com.zaxxer.hikari" level="info"/>
<Logger name="org.quartz" level="info"/>
<Logger name="com.andya.demo" level="debug"/>
</Loggers>
</Configuration>
Подробное объяснение параметров конфигурации
Configuration
корневой узелConfigurationЕсть два часто используемых свойства: статус и интервал монитора. как:<Configuration status="WARN" monitorInterval="30">
Атрибуты
-
status: используется для указания уровня log4j; -
monitorterval: используется для указания интервала для log4j для автоматического повторного обнаружения и чтения содержимого конфигурации в секундах (с) с минимальным значением 5 секунд.
Properties
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn" name="MyApp" packages="">
<properties>
<property name="LOG_HOME">./service-logs</property>
</properties>
<Appenders>
<File name="MyFile" fileName="${LOG_HOME}/app.log">
<PatternLayout>
<Pattern>%d %p %c{1.} [%t] %m%n</Pattern>
</PatternLayout>
</File>
</Appenders>
<Loggers>
<Root level="error">
<AppenderRef ref="MyFile"/>
</Root>
</Loggers>
</Configuration>
Конфигурация переменных, например, в шаблоне <property name="LOG_HOME">./service-logs</property>, мы можем настроить путь журнала. Путь префикса, в котором хранятся последующие журналы,./service-logsВниз,<File name="MyFile" fileName="${LOG_HOME}/app.log">Если префикс настроен в , app.log будет храниться в./service-logsВниз.
Appenders
Console
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn" name="MyApp" packages="">
<Appenders>
<Console name="STDOUT" target="SYSTEM_OUT">
<PatternLayout pattern="%m%n"/>
</Console>
</Appenders>
<Loggers>
<Root level="error">
<AppenderRef ref="STDOUT"/>
</Root>
</Loggers>
</Configuration>
Узел Console используется для определения Appender, который выводит консоль.
Атрибуты
-
name: используется для указания имени Appender; -
target: используется для указания цели вывода, обычноSYSTEM_OUTилиSYSTEM_ERR, по умолчаниюSYSTEM_OUT;
узел
-
PatternLayout: используется для указания выходного формата, если не установлен, по умолчанию:%m%n
File
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn" name="MyApp" packages="">
<Appenders>
<File name="MyFile" fileName="logs/app.log">
<PatternLayout>
<Pattern>%d %p %c{1.} [%t] %m%n</Pattern>
</PatternLayout>
</File>
</Appenders>
<Loggers>
<Root level="error">
<AppenderRef ref="MyFile"/>
</Root>
</Loggers>
</Configuration>
Узел Файл используется для вывода лога в указанный файл, как правило, этот узел не используется, ноRollingFileузел.
Атрибуты
-
name: используется для указания имени Appender; -
fileName: используется для указания полного пути к файлу журнала;
узел
-
PatternLayout: используется для указания выходного формата, если не установлен, по умолчанию:%m%n
RollingFile
Узел RollingFile используется для реализации аппендера изменений и обновлений файла журнала.При выполнении условий (размер журнала, указанное время и т. д.) исходный файл журнала переименовывается или упаковывается для архивирования, а новый файл журнала создается для запись журнала.
Мы можем установитьALL、DEBUG、 INFO、 WARN、 ERRORRollingFileAppender для этих уровней.
(1) Стратегия прокрутки на основе размера
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn" name="MyApp" packages="">
<Appenders>
<RollingFile name="RollingFile" fileName="logs/app.log"
filePattern="logs/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.log.gz">
<PatternLayout>
<Pattern>%d %p %c{1.} [%t] %m%n</Pattern>
</PatternLayout>
<Policies>
<TimeBasedTriggeringPolicy />
<SizeBasedTriggeringPolicy size="100 MB"/>
</Policies>
<DefaultRolloverStrategy max="10"/>
</RollingFile>
</Appenders>
<Loggers>
<Root level="error">
<AppenderRef ref="RollingFile"/>
</Root>
</Loggers>
</Configuration>
В приведенном выше шаблоне журнал записывается первымlogs/app.log, всякий раз, когда размер файла достигает 100 МБ или через 1 день, как вlogs/2020-09/в каталогеapp-2020-09-09-1.log.gzформат для сжатия, переименования и архивирования журнала и создания нового файлаapp.logЗаймитесь записью журнала.
в,filePatternсвойства в формате файла%iТак же, как целочисленный счетчик, с учетом <DefaultRolloverStrategy max="10"/>Контроль, обратите особое внимание: когда количество файлов достигнет 10,循环覆盖1-10 файлов, ранее заархивированных. Если этот параметр не установлен, по умолчанию7.
(2) Роллинговая стратегия на основе временного интервала
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn" name="MyApp" packages="">
<Appenders>
<RollingFile name="RollingFile" fileName="logs/app.log"
filePattern="logs/$${date:yyyy-MM}/app-%d{yyyy-MM-dd-HH}.log.gz">
<PatternLayout>
<Pattern>%d %p %c{1.} [%t] %m%n</Pattern>
</PatternLayout>
<Policies>
<TimeBasedTriggeringPolicy interval="6" modulate="true"/>
</Policies>
</RollingFile>
</Appenders>
<Loggers>
<Root level="error">
<AppenderRef ref="RollingFile"/>
</Root>
</Loggers>
</Configuration>
В приведенном выше шаблоне журнал записывается первымlogs/app.log, всякий раз, когда интервал между файлами достигает 6 часов (по%d{yyyy-MM-dd-HH}решение, также может быть установлено%d{yyyy-MM-dd-HH-mm}, интервал находится на уровне минут), запуская операцию ролловера.
После установки указанной выше конфигурации журнал начинает перезапускаться в 10:00, а с 11:00 запускается операция пролонгации для создания2020-09-09-10.log.gzСжать, переименовать и заархивировать журнал, а также создать новый файлapp.logЗапись лога, затем каждые 6 часов следующий раз срабатывает в 17:00, генерируя2020-09-09-17.log.gzСжать, переименовать и заархивировать журнал, а также создать новый файлapp.logЗаймитесь записью журнала.
(3) Стратегия прокрутки на основе временного интервала и размера файла
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn" name="MyApp" packages="">
<Appenders>
<RollingFile name="RollingFile" fileName="logs/app.log"
filePattern="logs/$${date:yyyy-MM}/app-%d{yyyy-MM-dd-HH}-%i.log.gz">
<PatternLayout>
<Pattern>%d %p %c{1.} [%t] %m%n</Pattern>
</PatternLayout>
<Policies>
<TimeBasedTriggeringPolicy interval="6" modulate="true"/>
<SizeBasedTriggeringPolicy size="100 MB"/>
</Policies>
</RollingFile>
</Appenders>
<Loggers>
<Root level="error">
<AppenderRef ref="RollingFile"/>
</Root>
</Loggers>
</Configuration>
В приведенном выше шаблоне журнал записывается первымlogs/app.log, всякий раз, когда размер файла достигает 100 МБ или когда временной интервал достигает 6 часов (по%d{yyyy-MM-dd-HH}решение), инициируйте операцию ролловера, выполните шаги, описанные вlogs/2020-09/в каталогеapp-2020-09-09-1.log.gzформат для сжатия, переименования и архивирования журнала и создания нового файлаapp.logЗаймитесь записью журнала.
Атрибуты
-
name: используется для указания имени Appender; -
fileName: используется для указания полного пути к файлу журнала; -
filePattern: используется для указания полного пути (правила именования) журнала для разделенного файла.
узел
-
PatternLayout: используется для указания выходного формата, если не установлен, по умолчанию:%m%n; -
Policies: Установить параметры резки лог-файла; -
SizeBasedTriggeringPolicy: дочерний узел политик, используемый для установки скользящей политики, запускаемой в зависимости от размера файла журнала,sizeСвойство используется для указания размера файла журнала для каждого разделения. -
TimeBasedTriggeringPolicy: дочерний узел Policies, используемый для установки политики прокрутки, запускаемой по интервалу времени,intervalСвойство используется для указания временного интервала прокрутки, по умолчанию 1 час,modulateСвойство используется для настройки смещения интервала, и по умолчанию оно равно false. Если это правда, первый раз он срабатывает в первый час, а затем срабатывает с интервалами. -
CronTriggeringPolicy: Дочерний узел Policies, используемый для установки скользящей политики, запускаемой выражением Cron. -
DefaultRolloverStrategy: установка параметров политики по умолчанию.
Loggers
узел
-
Root: используется для указания корневого журнала проекта,levelАтрибут указывает уровень вывода журнала, дочерний узелAppenderRefИспользуется для указания вывода в Appender, дочерний узелrefАтрибут также является именем, указанным в предыдущем файле RollingFile, и атрибутом дочернего узла.levelТакже уровень вывода журнала. -
Logger: используется для указания формы лога, указания уровня лога разных пакетов,levelатрибут указывает уровень вывода журнала,nameАтрибут используется для указания класса или полного пути к классу, к которому применяется Logger. дочерний узелAppenderRefИспользуется для указания, на какой Appender выводится журнал. Если не указано, по умолчанию он будет интегрирован из Root.
Ссылаться на
Адрес официального сайта log4j2