Логирование для Java: лучшие решения (Log4j, SLF4J, Logback, java.util.logging)

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Логирование для Java: лучшие решения

Логирование — неотъемлемая часть разработки любого серьёзного Java-приложения. Оно позволяет отслеживать ошибки, анализировать поведение системы и собирать метрики. В Java существует несколько зрелых решений, каждое из которых имеет свои особенности. В этой статье мы разберём четыре основных подхода: Log4j 2, SLF4J (как фасад), Logback и встроенный java.util.logging.

1. java.util.logging (JUL) — встроенное решение

JUL поставляется вместе с JDK, поэтому не требует дополнительных зависимостей. Однако его функционал ограничен по сравнению со сторонними библиотеками. Конфигурация обычно задаётся через файл logging.properties.

Пример настройки и использования:

// logging.properties
handlers = java.util.logging.ConsoleHandler
.level = INFO
java.util.logging.ConsoleHandler.level = FINEST
import java.util.logging.Logger;

public class JulExample {
    private static final Logger logger = Logger.getLogger(JulExample.class.getName());

    public static void main(String[] args) {
        logger.info("Это информационное сообщение");
        logger.warning("Предупреждение!");
        logger.fine("Детальная отладочная информация (уровень FINEST)");
    }
}

Плюсы: нулевая зависимость, простота.

Минусы: ограниченная гибкость, более низкая производительность, сложность тонкой настройки.

2. Log4j 2 — мощное и современное решение

Log4j 2 — наследник популярного Log4j 1.x. Он предлагает асинхронное логирование, поддержку JSON, фильтры и множество аппендеров (файлы, базы данных, Kafka).

Подключение (Maven):

<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>2.20.0</version>
</dependency>

Пример конфигурации (log4j2.xml):

<?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="info">
            <AppenderRef ref="Console"/>
        </Root>
    </Loggers>
</Configuration>
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class Log4j2Example {
    private static final Logger logger = LogManager.getLogger(Log4j2Example.class);

    public static void main(String[] args) {
        logger.debug("Отладка: вход в метод main");
        logger.info("Приложение запущено");
        try {
            int result = 10 / 0;
        } catch (ArithmeticException e) {
            logger.error("Ошибка деления на ноль", e);
        }
    }
}

Плюсы: высокая производительность (асинхронные аппендеры), гибкая конфигурация, поддержка многопоточности.

Минусы: необходимость вручную добавлять зависимость, сложность конфигурации для новичков.

3. Logback — преемник Log4j 1.x

Logback считается прямым наследником Log4j и разработан тем же автором. Он быстрее, имеет встроенную поддержку SLF4J и автоматическую перезагрузку конфигурации.

Подключение (Maven):

<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.4.14</version>
</dependency>

Пример конфигурации (logback.xml):

<configuration>
    <appender name="FILE" class="ch.qos.logback.core.FileAppender">
        <file>app.log</file>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

    <root level="debug">
        <appender-ref ref="FILE"/>
    </root>
</configuration>
import org.slf4j.Logger;
import org.slf4                    

Рекомендаций