Настройка Logback
Аппендеры, шаблоны и уровни
«Настройка Logback» — бесплатный урок Java Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Java Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Java Academy содержит 4 уроков всего.
Что такое Logback?
Logback — популярная реализация SLF4J, написанная тем же автором, что и Log4j. Именно она выполняет журналирование, которое описывается вызовами SLF4J.
Её настраивают с помощью файла logback.xml в пути классов, обычно в каталоге src/main/resources.
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Main {
private static final Logger log = LoggerFactory.getLogger(Main.class);
public static void main(String[] args) {
log.info("Logback reads logback.xml at startup");
}
}Три строительных блока
Конфигурация Logback опирается на три основных понятия:
- Logger: именованный источник событий журнала с определённым уровнем.
- Приёмник: место назначения (консоль или файл).
- Кодировщик/формат: преобразует событие в текст.
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Main {
private static final Logger log = LoggerFactory.getLogger(Main.class);
public static void main(String[] args) {
log.info("logger -> appender -> encoder -> output");
}
}Приёмник консоли
Самая простая конфигурация отправляет всё в консоль. Шаблон кодировщика определяет формат строки.
Этот XML находится в logback.xml, а не в Вашем коде Java.
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss.SSS} %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<root level="info">
<appender-ref ref="STDOUT" />
</root>
</configuration>Понимание шаблона
Слова преобразования в шаблоне начинаются с %:
%d— отметка времени,%level— уровень.%logger— имя регистратора,%thread— поток.%msg— Ваше сообщение,%n— перевод строки.
%-5level дополняет уровень слева до ширины 5.
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Main {
private static final Logger log = LoggerFactory.getLogger(Main.class);
public static void main(String[] args) {
// Output rendered by pattern: time LEVEL logger - message
log.info("hello");
}
}Корневой регистратор и уровни
Элемент <root> задаёт уровень по умолчанию для всего приложения и приёмники, в которые оно выполняет запись.
Установка level="info" означает, что выводятся INFO, WARN и ERROR, а DEBUG и TRACE подавляются.
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder><pattern>%-5level %logger - %msg%n</pattern></encoder>
</appender>
<root level="warn">
<appender-ref ref="STDOUT" />
</root>
</configuration>Уровни для отдельных пакетов
Добавьте элемент <logger>, чтобы переопределить уровень для пакета. Это позволяет включить DEBUG для собственного кода, сохранив библиотеки без лишнего вывода.
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder><pattern>%-5level %logger - %msg%n</pattern></encoder>
</appender>
<logger name="com.example.app" level="debug" />
<root level="info">
<appender-ref ref="STDOUT" />
</root>
</configuration>Приёмник с ротацией файлов
В рабочей среде обычно выполняют запись в файлы, которые сменяются ежедневно или при достижении определённого размера, чтобы журналы не росли бесконечно.
RollingFileAppender с политикой, основанной на времени, создаёт отдельный файл на каждый день и хранит ограниченную историю.
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>logs/app.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>logs/app.%d{yyyy-MM-dd}.log</fileNamePattern>
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%d %-5level [%thread] %logger{36} - %msg%n</pattern>
</encoder>
</appender>Несколько приёмников одновременно
Корневой регистратор может ссылаться на несколько приёмников, поэтому записи одновременно отправляются и в консоль, и в файл.
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder><pattern>%-5level %msg%n</pattern></encoder>
</appender>
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<file>logs/app.log</file>
<encoder><pattern>%d %-5level %msg%n</pattern></encoder>
</appender>
<root level="info">
<appender-ref ref="STDOUT" />
<appender-ref ref="FILE" />
</root>
</configuration>Вывод MDC
Чтобы включать контекст MDC, например идентификатор запроса, в каждую строку, добавьте %X{key} в шаблон.
После этого любое значение, помещённое в MDC, будет появляться автоматически.
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.slf4j.MDC;
public class Main {
private static final Logger log = LoggerFactory.getLogger(Main.class);
public static void main(String[] args) {
MDC.put("requestId", "req-1234");
// Pattern: %X{requestId} %-5level %msg%n
log.info("handled");
MDC.clear();
}
}Аддитивность
По умолчанию события регистратора также передаются приёмникам его предков. Это называется аддитивностью.
Если у регистратора пакета есть собственный приёмник и Вы не хотите получать дублирующийся вывод, задайте для него additivity="false".
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder><pattern>%-5level %logger - %msg%n</pattern></encoder>
</appender>
<logger name="com.example.audit" level="info" additivity="false">
<appender-ref ref="STDOUT" />
</logger>
<root level="warn">
<appender-ref ref="STDOUT" />
</root>
</configuration>Автоматическая перезагрузка и переменные
Logback может периодически перезагружать конфигурацию с помощью <configuration scan="true">, что удобно для изменения уровней без перезапуска.
Также можно считывать свойства, например каталог журналов, с помощью заполнителей ${LOG_DIR}.
<configuration scan="true" scanPeriod="30 seconds">
<property name="LOG_DIR" value="logs" />
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<file>${LOG_DIR}/app.log</file>
<encoder><pattern>%d %-5level %msg%n</pattern></encoder>
</appender>
<root level="info"><appender-ref ref="FILE" /></root>
</configuration>Быстрая проверка
Проверьте свои знания о конфигурации Logback.
Итоги
Вы научились настраивать Logback:
- Конфигурация хранится в
logback.xmlи содержит регистраторы, приёмники и кодировщики. - Шаблоны форматируют строки с помощью
%d,%level,%msg,%X{}. - RollingFileAppender выполняет ротацию журналов; задавайте уровни для отдельных пакетов и аддитивность.
- Включайте
scanдля перенастройки без остановки приложения.
Вы завершили курс по журналированию.
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Main {
private static final Logger log = LoggerFactory.getLogger(Main.class);
public static void main(String[] args) {
log.info("Logback configuration course complete");
}
}Часто задаваемые вопросы
Урок «Настройка Logback» бесплатный?
Да — полный текст урока «Настройка Logback» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Java Academy, подпишись на CoddyKit PRO. Курс Java Academy содержит 4 уроков всего.
Чему я научусь в уроке «Настройка Logback»?
Аппендеры, шаблоны и уровни Ты практикуешь Java Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Java Academy?
Предыдущий опыт не требуется. Java Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.
Сколько времени занимает урок «Настройка Logback»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Java Academy?
Да. Каждый урок Java Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Зачем нужна структурированная регистрация
- Фасад SLF4J и регистраторы
- Параметризованная регистрация
- Настройка Logback