Настройка Logback: запись разных уровней логирования в Logback

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Для того чтобы в Logback поделить логи различных уровней по разным местам вывода, следует настроить два аппендера, которые будут обрабатывать конкретные уровни логирования. Допустим, вы хотите, чтобы логи уровня INFO выводились на консоль, а логи уровня DEBUG сохранялись в файл. В этом случае каждому из аппендеров потребуется свой <filter>. Пример подобной конфигурации:

xml
Скопировать код
<configuration>
  <!-- Аппендер для консоли, который обрабатывает уровень INFO -->
  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
      <level>INFO</level>
    </filter>
    <!-- Указание кодировщика опущено -->
  </appender>
  
  <!-- Аппендер для файла, обрабатывающий уровень DEBUG -->
  <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
      <level>DEBUG</level>
    </filter>
    <!-- Указание деталей кодировщика и политики ротации файлов опущено -->
  </appender>

  <!-- Настройка логгера -->
  <logger name="com.yourpackage" level="DEBUG" additivity="false">
    <appender-ref ref="STDOUT" />
    <appender-ref ref="FILE" />
  </logger>
</configuration>

Значение name в <logger> следует заменить на имя вашего пакета. Таким образом, уровень INFO будет выводиться на консоль, а DEBUG будет записываться в log-файл.

Кинга Идем в IT: пошаговый план для смены профессии

Завершение

Описанная выше базовая настройка позволит разделить вывод логов уровней INFO и DEBUG. Однако на практике во многих проектах требуются более сложные схемы логирования, например, направление логов уровня ERROR в STDERR или интеграция с внешними системами вроде Slack или email. Все эти потребности можно удовлетворить с помощью Logback, который предлагает соответствующие подходы и специальные фильтры.

Разделение потоков вывода между STDOUT и STDERR

Чтобы перенаправлять логи уровня ERROR в STDERR, а логи уровня INFO — в STDOUT, следует использовать два объекта ConsoleAppender с разными значениями target:

xml
Скопировать код
<appender name="STDERR" class="ch.qos.logback.core.ConsoleAppender">
  <target>System.err</target>
  <filter class="ch.qos.logback.classic.filter.LevelFilter">
    <level>ERROR</level>
    <onMatch>ACCEPT</onMatch>
    <onMismatch>DENY</onMismatch>
  </filter>
  <!-- Кодировщик опущен -->
</appender>

<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
  <filter class="ch.qos.logback.classic.filter.LevelFilter">
    <level>INFO</level>
    <onMatch>ACCEPT</onMatch>
    <onMismatch>DENY</onMismatch>
  </filter>
  <!-- Кодировщик опущен -->
</appender>

Установка шаблонов кодирования

Эффективное логирование начинается с правильно выбранного шаблона кодирования. Он обеспечивает единообразие форматирования выводимых сообщений:

xml
Скопировать код
<encoder>
  <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} – %msg%n</pattern>
</encoder>

Регулирование логирования с помощью фильтров и порогов

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

Визуализация

Настройку Logback можно интерпретировать как организацию движения на перегруженном перекрёстке. Вы расставляете светофоры (🚦) для каждого уровня логов:

Markdown
Скопировать код
🚦 INFO направляется на Консоль (🖥️)
🚦 DEBUG перенаправляется в Файл (📁)
🚦 ERROR отправляется на Уведомления (🚨)

Такая конфигурация обеспечивает чёткий и упорядоченный поток данных в системе логирования.

Учёт контекста в масштабных проектах

В крупномасштабных проектах важно учитывать контекст логирования для различных частей приложения. Это реализуется с помощью параметра ContextName:

xml
Скопировать код
<configuration scan="true" scanPeriod="30 seconds" debug="false">
  <contextName>myAppName</contextName>
  <!-- Здесь идут настройки аппендеров -->
</configuration>

Использование Groovy для гибкой настройки

Вместо XML Logback позволяет использовать Groovy для более гибкой и динамичной настройки, адаптируемой под различные условия рабочей среды.

Внутренний статус для диагностики проблем

Logback способен предоставлять информацию о своём внутреннем состоянии, что бывает критически важно при отладке конфигурации:

xml
Скопировать код
<configuration>
  <statusListener class="ch.qos.logback.core.status.OnConsoleStatusListener" />
  <!-- Продолжение конфигурации -->
</configuration>

Полезные материалы

Вот список полезных источников для более глубокого изучения и расширения знаний о Logback: от основ конфигурации до создания пользовательских аппендеров и эффективной работы с фильтрами.