Введение в логбэк
Logback – это стабильная, эффективная и быстрая среда ведения журналов Java. Являясь улучшенной версией log4j, она имеет больше функций, чем log4j, а также значительно повышает производительность. Конкретные улучшения см.официальная документация.
Logback в основном разделен на три модуля
- logback-core: основной модуль, который служит основой для классических модулей и модулей доступа.
- logback-classic: реализует API slf4j, используемый с slf4j, вы можете легко переключаться на другие фреймворки журналов
- logback-access: интегрирован с контейнерами сервлетов (такими как Tomcat и Jetty), предоставляя интерфейс журнала доступа HTTP.
Логбэк загрузки
Когда Logback начинает загружаться, он ищет файлы конфигурации в следующем порядке.
- Найдите значение, соответствующее logback.configurationFile, в системном файле конфигурации System Properties.
- Ищите logback.groovy в пути к классам (logback поддерживает конфигурацию groovy и xml)
- Найдите logback-test.xml в пути к классам.
- Найдите logback.xml в пути к классам.
При обнаружении какой-либо конфигурации последующее сканирование выполняться не будет, а файл конфигурации будет использоваться для инициализации.Если файл конфигурации не найден, Logback создаст конфигурацию, которая выводит логи в консоль.
Конфигурация журнала
конфигурация корневого узла
конфигурация является корневым узлом файла конфигурации и имеет три свойства:
- debug: значение по умолчанию — false.Если установлено значение true, внутренняя информация журнала logback будет распечатана, а текущее состояние logback будет просматриваться в режиме реального времени.
- scan: значение по умолчанию — true.Если установлено значение true, в случае изменения файла конфигурации он будет перезагружен.
- scanPeriod: это свойство вступает в силу, только если для сканирования установлено значение true. Устанавливает интервал сканирования конфигурационных файлов на наличие модификаций.Единица измерения по умолчанию — миллисекунды. Временной интервал по умолчанию составляет 1 минуту (60 секунд).
Код конфигурации:
<configuration scan="true" scanPeriod="60 second" debug="true">
</configuration>
установить имя контекста contextName
Каждый регистратор связан с контекстом регистратора, имя контекста по умолчанию — «по умолчанию». Но вы можете использовать
Код конфигурации:
<contextName>new context name</contextName>
установить переменное свойство
Свойство – это метка, используемая для определения переменных. После установки к ней можно получить доступ с помощью ${имя переменной}. Существует три свойства:
- имя: имя переменной
- значение: переменное значение
- файл: указывает путь к файлу конфигурации. Его функция заключается в том, что если имеется несколько сведений о конфигурации, их можно записать непосредственно в файл конфигурации, а затем импортировать через файл
- ресурс: функция такая же, как и файл, разница в том, что он может напрямую импортировать файл конфигурации из пути к классам
Код конфигурации:
<!-- name value 形式 -->
<property name="APP_Name" value="MyApp"/>
<contextName>${APP_Name}</contextName>
<!-- file 形式 -->
variables.properties:
APP_Name=MyApp
LOG_PATH=logs
<property file="src/main/java/config/variables.properties" />
<contextName>${APP_Name}</contextName>
<!-- resource 形式 -->
variables.properties:
APP_Name=MyApp
LOG_PATH=logs
<property resource="variables.properties" />
<contextName>${APP_Name}</contextName>
регистратор дочерних узлов конфигурации, корень
logger используется для установки уровня вывода журнала и местоположения вывода (указанного приложения) класса или пакета.Существует три атрибута:
- name: указанное имя пакета или имя класса
- уровень: выходной уровень журнала, если этот уровень не установлен, текущий регистратор наследует последний непустой уровень вверх, root имеет уровень отладки по умолчанию
- аддитивность: передавать ли лог на верхний уровень, по умолчанию true
Регистратор указывает место вывода журнала, устанавливая дочерний узел appender-ref. Регистратор может установить несколько appender-refs.
Код конфигурации:
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<Pattern>[%d{HH:mm:ss.SSS}] [%5level] [%thread] %logger{36} %msg%n</Pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<logger name="X" level="INFO" additivity="false">
<appender-ref ref="STDOUT"/>
</logger>
<logger name="X.Y" additivity="false">
<appender-ref ref="STDOUT"/>
</logger>
root — это специальный регистратор, который является корневым узлом всех регистраторов, потому что он называется корневым и не имеет родительского уровня, поэтому существует только один уровень атрибутов, который по умолчанию равен DEBUG.
Код конфигурации:
<root level="DEBUG">
<appender-ref ref="STDOUT"/>
<appender-ref ref="ASYNC"/>
</root>
пример наследования уровня 1:
logger name | level | фактический уровень |
---|---|---|
root | DEBUG | DEBUG |
X | не задано | DEBUG |
X.Y | не задано | DEBUG |
X.Y.Z | не задано | DEBUG |
В примере 1 только root задал уровень, а три логгера X, X.Y и X.Y.Z не задали уровень вывода лога, поэтому уровень root наследуется вверх, то есть DEBUG
пример наследования уровня 2:
logger name | level | фактический уровень |
---|---|---|
root | ERROR | ERROR |
X | INFO | INFO |
X.Y | DEBUG | DEBUG |
X.Y.Z | WARN | WARN |
Пример 2. У всех регистраторов установлен уровень ведения журнала, и наследование уровней не работает.
пример наследования уровней 3:
logger name | level | фактический уровень |
---|---|---|
root | DEBUG | DEBUG |
X | INFO | INFO |
X.Y | не задано | INFO |
X.Y.Z | WARN | WARN |
Пример 3 X.Y не устанавливает уровень журнала и наследует значение самого последнего регистратора X с уровнем журнала вверх.
Пример наследования уровней 4:
logger name | level | фактический уровень |
---|---|---|
root | DEBUG | DEBUG |
X | INFO | INFO |
X.Y | не задано | INFO |
X.Y.Z | не задано | INFO |
Пример 4. X.Y и X.Y.Z не имеют установленного уровня ведения журнала и наследуют значение самого последнего средства ведения журнала X с более высоким уровнем ведения журнала.
приложение дочернего узла конфигурации
Приложение appender отвечает за запись логов и имеет два свойства (оба должны быть настроены при использовании):
- имя: Установите имя приложения для ссылки в последующих настройках регистратора.
- class: Установите полное имя класса пути для приложения, например: ch.qos.logback.core.ConsoleAppender
Приложение может содержать ноль или один макет, ноль или более элементов кодировщика и ноль или более элементов фильтра. В дополнение к этим трем элементам может также содержать любое количество элементов, соответствующих свойствам JavaBean класса приложения, например: файл Определяет имя файла журнала.
- макет: формат журнала
- кодировщик: кодировщик был представлен после версии 0.9.19, в предыдущих версиях использовалась раскладка, журнал настоятельно рекомендует использовать кодировщик вместо раскладки
- filter: фильтровать журналы
Обычно используются следующие приложения:
- ConsoleAppender: вывод на консоль или, скорее, в System.out или System.err, первый из которых является местом назначения по умолчанию.
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%msg%n</pattern>
</encoder>
<target>
System.err
</target>
</appender>
- FileAppender: вывод в файл, целевой файл указывается файлом. Если файл уже существует, добавьте или очистите файл в соответствии со значением атрибута append.
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<file>testFile.log</file>
<append>true</append>
<!-- set immediateFlush to false for much higher logging throughput -->
<immediateFlush>true</immediateFlush>
<!-- encoders are assigned the type
ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
<encoder>
<pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
</encoder>
</appender>
- RollingFileAppender: унаследован от FileAppender, обеспечивает функцию скользящей записи, сначала записывает журнал в указанный файл, а при срабатывании определенного условия записывает журнал в другие файлы. Есть два важных дочерних узла: rollPolicy и triggeringPolicy.
- RollingPolicy: определяет поведение RollingFileAppender при прокрутке, например при переключении файлов журнала.
- triggeringPolicy: указывает, когда RollingFileAppender запускает прокрутку.
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>logFile.log</file>
<!-- 根据时间来制定滚动策略,既负责滚动也负责触发滚动。 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 每天生成日志文件 -->
<fileNamePattern>logFile.%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- 保留最近30天的日志文件 -->
<maxHistory>30</maxHistory>
<totalSizeCap>3GB</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
</encoder>
</appender>
<appender name="ROLLING" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>mylog.txt</file>
<!-- 基于文件大小和时间的滚动策略 -->
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!-- 每天生成日志文件 -->
<fileNamePattern>mylog-%d{yyyy-MM-dd}.%i.txt</fileNamePattern>
<!-- 每个日志文件最多 100MB, 保留 60 天, 最多 20 GB-->
<maxFileSize>100MB</maxFileSize>
<maxHistory>60</maxHistory>
<totalSizeCap>20GB</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>%msg%n</pattern>
</encoder>
</appender>
- AsyncAppender: асинхронное ведение журнала, он действует только как планировщик, поэтому для вывода журнала необходимо ссылаться на другой модуль добавления.
- discardingThreshold: по умолчанию, когда оставшаяся емкость очереди блокировки составляет 20 %, она будет отбрасывать события уровня TRACE, DEBUG и INFO и сохранять только события уровня WARN и ERROR. Установите 0, чтобы сохранить все события.
- queueSize: максимальная емкость очереди блокировки. По умолчанию размер очереди равен 256.
- appender-ref: указывает, какое конкретное приложение используется AsyncAppender для вывода журнала.
<!-- 异步输出 -->
<appender name ="ASYNC" class= "ch.qos.logback.classic.AsyncAppender">
<!-- 不丢失日志 -->
<discardingThreshold>0</discardingThreshold>
<!-- 更改默认的队列的深度,该值会影响性能.默认值为256 -->
<queueSize>256</queueSize>
<!-- 添加附加的appender,最多只能添加一个 -->
<appender-ref ref ="FILE"/>
</appender>
<logger name="X" level="DEBUG">
<appender-ref ref="ASYNC" />
</logger>