Фреймворк ведения журналов Java

Java задняя часть Debug Groovy

Введение в логбэк

Logback – это стабильная, эффективная и быстрая среда ведения журналов Java. Являясь улучшенной версией log4j, она имеет больше функций, чем log4j, а также значительно повышает производительность. Конкретные улучшения см.официальная документация.

Logback в основном разделен на три модуля

  • logback-core: основной модуль, который служит основой для классических модулей и модулей доступа.
  • logback-classic: реализует API slf4j, используемый с slf4j, вы можете легко переключаться на другие фреймворки журналов
  • logback-access: интегрирован с контейнерами сервлетов (такими как Tomcat и Jetty), предоставляя интерфейс журнала доступа HTTP.

Логбэк загрузки

Когда Logback начинает загружаться, он ищет файлы конфигурации в следующем порядке.

  1. Найдите значение, соответствующее logback.configurationFile, в системном файле конфигурации System Properties.
  2. Ищите logback.groovy в пути к классам (logback поддерживает конфигурацию groovy и xml)
  3. Найдите logback-test.xml в пути к классам.
  4. Найдите 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: фильтровать журналы

Обычно используются следующие приложения:

  1. 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>
  1. 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>
  1. 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>
  1. 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>