Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Уровни логирования в 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>
Это критично для микросервисов, где каждая миллисекунда важна.