← Назад к вопросам

Какие знаешь уровни логирования?

1.3 Junior🔥 231 комментариев
#Основы Java

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Уровни логирования в Java

Логирование — это критически важная часть поддержки production приложений. Правильная классификация сообщений по уровням позволяет быстро находить проблемы, отладить сложные сценарии и не захламлять логи лишней информацией.

Основные уровни логирования

В Java используется стандартная иерархия уровней, обычно реализуемая через SLF4J, Logback или Log4j2. От критических к информационным:

1. ERROR (Ошибка)

Используется для: ошибки приложения, которые нарушают нормальную работу

logger.error("Ошибка подключения к БД", new SQLException("Connection timeout"));
logger.error("Не удалось обработать платёж для пользователя {}", userId);

Это самый критичный уровень (после FATAL). Каждый ERROR в production означает, что что-то сломалось и требует внимания.

2. WARN (Предупреждение)

Используется для: потенциальные проблемы, которые не полностью нарушают работу

logger.warn("Кэш переполнен, старые записи будут вытеснены");
logger.warn("Время ответа превышает {}ms", timeout);

Примеры: deprecated API, конфигурация не оптимальна, ресурсы близки к исчерпанию.

3. INFO (Информация)

Используется для: важные события жизненного цикла приложения

logger.info("Приложение запущено на {}:{}", host, port);
logger.info("Пользователь {} успешно залогинился", username);
logger.info("Обработано {} заказов за период", count);

INFO логи помогают отслеживать основные события. В production обычно крутится именно INFO уровень.

4. DEBUG (Отладка)

Используется для: детальная информация для отладки проблем

logger.debug("Запрос на получение пользователя, id={}", userId);
logger.debug("SQL запрос: SELECT * FROM users WHERE id=?");
logger.debug("Ответ от внешнего API: {}", jsonResponse);

DEBUG часто отключается в production, чтобы не захламлять логи. Используется во время разработки.

5. TRACE (Трассировка)

Используется для: максимально детальная информация для глубокой отладки

logger.trace("Вход в метод calculateTotal()");
logger.trace("Параметры: items={}, discount={}", items, discount);
logger.trace("Выход из метода с результатом: {}", result);

TRACE практически никогда не включается в production.

Иерархия уровней

Это иерархия: если установлен уровень WARN, то вывод будут ERROR и WARN, но не INFO, DEBUG, TRACE.

OFF     — логирование полностью отключено
ERROR  — только критические ошибки
WARN   — ошибки + предупреждения
INFO   — ошибки + предупреждения + информация (PRODUCTION)
DEBUG  — все выше + детали отладки (разработка)
TRACE  — все выше + максимум деталей (редко)
ALL    — все логи включены

Настройка в Logback

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

    <logger name="com.myapp" level="INFO"/>
    <logger name="com.myapp.payment" level="DEBUG"/>
    <logger name="org.springframework" level="WARN"/>
    <logger name="org.hibernate" level="WARN"/>

    <root level="INFO">
        <appender-ref ref="CONSOLE"/>
    </root>
</configuration>

Настройка в application.properties

logging.level.root=INFO
logging.level.com.myapp=DEBUG
logging.level.org.springframework.web=WARN
logging.level.org.hibernate.SQL=DEBUG

Best Practices

DO:

  • ✅ Логируй входные параметры в методах при отладке
  • ✅ Логируй исключения с stacktrace при ERROR/WARN
  • ✅ Используй placeholders: logger.info("User {} logged in", userId)
  • ✅ Логируй importantes события (успешные операции, перезагрузка конфига)
  • ✅ Разные уровни для разных компонентов

DON'T:

  • ❌ Не логируй чувствительные данные (пароли, токены)
  • ❌ Не используй System.out.println() в production коде
  • ❌ Не логируй одно и то же в разных местах
  • ❌ Не создавай очень длинные сообщения
  • ❌ Не забывай про производительность

Асинхронные аппендеры

Для высоконагруженных приложений используются асинхронные аппендеры:

<appender name="ASYNC" class="ch.qos.logback.classic.AsyncAppender">
    <queueSize>512</queueSize>
    <discardingThreshold>0</discardingThreshold>
    <appender-ref ref="FILE"/>
</appender>

Это критично для микросервисов, где каждая миллисекунда важна.