Это 4-й день моего участия в Gengwen Challenge, смотрите подробности мероприятия:Обновить вызов
1. Введение в Log4j2
Версия Log4j 2.x больше не поддерживает метод конфигурации файла с суффиксом .properties в версии 1.x, имя суффикса файла конфигурации версии 2.x может быть только «.xml», «.json» или «.jsn».
- Формат файла конфигурации: файл конфигурации log2j может быть в формате xml или json.
- расположение файла конфигурации: log4j2 по умолчанию будет искать файлы с такими именами, как log4j2.xml, log4j.json, log4j.jsn и т. д. в каталоге пути к классам.
Приоритет конфигурационного файла выбора системы (от первого к последнему) следующий:
- Файл с именем log4j2-test.json или log4j2-test.jsn в пути .class.
- Файл с именем log4j2-test.xml в .classpath.
- Файл с именем log4j2.json или log4j2.jsn в .classpath.
- Файл с именем log4j2.xml в .classpath.
Обычно мы используем log4j2.xml для именования по умолчанию.
Во-вторых, анализ узла файла конфигурации
(1).Корневой узел
- Конфигурация имеет два свойства: статус и интервал монитора, а также два дочерних узла: Appenders и Loggers (указывая, что можно определить несколько Appenders и Loggers).
- status используется для указания уровня собственного журнала печати log4j.
- monitorinterval используется для указания интервала мониторинга автоматической реконфигурации log4j, единица измерения — с, а минимум — 5 с.
(2).Узел Appenders,
Есть три общих дочерних узла: Console, RollingFile, File.
- Узел Console используется для определения Appenders, которые выводят на консоль.
- name: Укажите имя Appender.
- цель: SYSTEM_OUT или SYSTEM_ERR, обычно устанавливается только значение по умолчанию: SYSTEM_OUT.
- PatternLayout: формат вывода, если он не задан, по умолчанию используется: %m%n.
- Узел File используется для определения Appender вывода файла в указанное место.
- name: Укажите имя Appender.
- имя_файла: указывает имя файла с полным путем к целевому файлу выходного журнала.
- PatternLayout: формат вывода, если он не задан, по умолчанию используется: %m%n.
- Узел RollingFile используется для определения нового Appender, который автоматически удаляет старый, когда размер превышает указанный размер.
- name: Укажите имя Appender.
- имя_файла: указывает имя файла с полным путем к целевому файлу выходного журнала.
- PatternLayout: формат вывода, если он не задан, по умолчанию используется: %m%n.
- filePattern: определяет формат имени нового файла журнала.
- Политики. Укажите стратегию переноса журналов, то есть когда создавать новый файл журнала для вывода журнала.
- TimeBasedTriggeringPolicy: дочерний узел Policies, политика прокрутки на основе времени, атрибут интервала используется для указания частоты прокрутки, значение по умолчанию — 1 час. modulate=true используется для настройки времени: например, сейчас 3 часа ночи, а интервал равен 4 часам, затем первая прокрутка в 4 часа ночи, затем 8 часов утра, 12 часов утра... не 7 часов утра.
- SizeBasedTriggeringPolicy: дочерний узел политик, основанный на скользящей политике указанного размера файла, атрибут размера используется для определения размера каждого файла журнала.
- DefaultRolloverStrategy: используется для указания того, что при наличии не более нескольких файлов журнала в одной папке самый старый будет удален, а новый будет создан (через атрибут max).
- Атрибут ThresholdFilter: onMatch указывает, является ли установленный уровень журнала DENY или ACCEPT, а onMismatch указывает, является ли уровень журнала, который не соответствует набору, DENY, ACCEPT или NEUTRAL.
(3).Узел Loggers
Есть два общих: Root и Logger.
- Узел Root используется для указания корневого журнала проекта.Если Logger не указан отдельно, вывод корневого журнала будет использоваться по умолчанию.
- level: уровень вывода журнала, существует 8 уровней, от низкого до высокого: All
- Узел Logger используется для того, чтобы указать форму журнала отдельно, например, чтобы указать разные уровни журнала для классов в указанном пакете.
- level: уровень вывода журнала, существует 8 уровней, от низкого до высокого: All
- имя: используется для указания класса, к которому применяется Logger, или полного пути пакета, в котором находится класс, унаследованного от корневого узла.
- AppenderRef: дочерний узел Logger, который используется для указания того, в какой Appender выводится журнал. Если он не указан, он будет наследоваться от Root по умолчанию. Если указан, он будет выводиться как в указанном Appender, так и в Appender. Root. В настоящее время мы можем установить additivity="false" Logger для вывода только в пользовательском Appender.
(4) Насчет уровня лога.
-
Всего существует 8 уровней, от низкого до высокого: All
-
Все: самый низкий уровень, используемый для включения всех журналов.
-
Трассировка: Это трассировка, то есть если программа продвигается ниже, то можно написать вывод трассировки, поэтому трассировок должно быть много, но это не беда, мы можем установить минимальный уровень лога, чтобы она не выводилась .
-
Отладка: указание на детализированные информационные события очень полезно для отладки приложений.
-
Информация: сообщения подсвечивают запущенный процесс приложения на грубом уровне.
-
Предупреждение: вывод предупреждений и журналов под предупреждением.
-
Ошибка: вывести журнал сообщений об ошибках.
-
Fatal: выводит журнал для каждой критической ошибки, которая приведет к завершению работы приложения.
-
OFF: Самый высокий уровень, используемый для отключения всей регистрации.
-
Программа будет печатать журналы выше или равные установленному уровню Чем выше установленный уровень журнала, тем меньше журналов будет распечатано.
-
Объяснение параметров конфигурации
-
%d{HH:mm:ss.SSS} означает время вывода в миллисекундах
-
%t печатает имя текущего потока
-
%-5level 输出日志级别,-5表示左对齐并且固定输出5个字符,如果不足在右边补0 -
%logger 输出logger名称,因为Root Logger没有名称,所以没有输出 -
Текст журнала %msg
-
%n 换行Другими часто используемыми заполнителями являются:
%F 输出所在的类文件名,如Log4j2Test.java
%L 输出行号
%M 输出所在方法名
%l 输出语句所在的行数, 包括类名、方法名、文件名、行数
В-третьих, необходимые зависимости Maven
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.5</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.5</version>
</dependency>
В-четвертых, самая простая конфигурация
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</Console>
</Appenders>
<Loggers>
<Root level="error">
<AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>
Пять, более полная конфигурация
<?xml version="1.0" encoding="UTF-8"?>
<!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
<!--Configuration后面的status,这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,你会看到log4j2内部各种详细输出-->
<!--monitorInterval:Log4j能够自动检测修改配置 文件和重新配置本身,设置间隔秒数-->
<configuration status="WARN" monitorInterval="30">
<!--先定义所有的appender-->
<appenders>
<!--这个输出控制台的配置-->
<console name="Console" target="SYSTEM_OUT">
<!--输出日志的格式-->
<PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
</console>
<!--文件会打印出所有信息,这个log每次运行程序会自动清空,由append属性决定,这个也挺有用的,适合临时测试用-->
<File name="log" fileName="log/test.log" append="false">
<PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/>
</File>
<!-- 这个会打印出所有的info及以下级别的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档-->
<RollingFile name="RollingFileInfo" fileName="${sys:user.home}/logs/info.log"
filePattern="${sys:user.home}/logs/$${date:yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log">
<!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
<Policies>
<TimeBasedTriggeringPolicy/>
<SizeBasedTriggeringPolicy size="100 MB"/>
</Policies>
</RollingFile>
<RollingFile name="RollingFileWarn" fileName="${sys:user.home}/logs/warn.log"
filePattern="${sys:user.home}/logs/$${date:yyyy-MM}/warn-%d{yyyy-MM-dd}-%i.log">
<ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
<Policies>
<TimeBasedTriggeringPolicy/>
<SizeBasedTriggeringPolicy size="100 MB"/>
</Policies>
<!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件,这里设置了20 -->
<DefaultRolloverStrategy max="20"/>
</RollingFile>
<RollingFile name="RollingFileError" fileName="${sys:user.home}/logs/error.log"
filePattern="${sys:user.home}/logs/$${date:yyyy-MM}/error-%d{yyyy-MM-dd}-%i.log">
<ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
<Policies>
<TimeBasedTriggeringPolicy/>
<SizeBasedTriggeringPolicy size="100 MB"/>
</Policies>
</RollingFile>
</appenders>
<!--然后定义logger,只有定义了logger并引入的appender,appender才会生效-->
<loggers>
<!--过滤掉spring和mybatis的一些无用的DEBUG信息-->
<logger name="org.springframework" level="INFO"></logger>
<logger name="org.mybatis" level="INFO"></logger>
<root level="all">
<appender-ref ref="Console"/>
<appender-ref ref="RollingFileInfo"/>
<appender-ref ref="RollingFileWarn"/>
<appender-ref ref="RollingFileError"/>
</root>
</loggers>
</configuration>