SLF4J + Logback
Логирование — записывать, что происходит в программе, в файл/консоль, чтобы потом можно было разобраться, что пошло не так — без логов отладка прода превращается в гадание.
System.out.println() для этого не годится — нет уровней важности, нельзя гибко настроить, куда писать, нельзя быстро отключить в проде. Поэтому используют специальные библиотеки логирования.
SLF4J — единый интерфейс для логирования, а Logback — конкретная реализация, которая по нему пишет:
private static final Logger log = LoggerFactory.getLogger(MyClass.class);
log.info("Пользователь {} вошёл в систему", userId); // {} — плейсхолдер, как в String.format
log.warn("Подозрительная активность: {} попыток", attempts);
log.error("Не удалось сохранить заказ", exception); // можно передать сам Exception
Копнуть глубже
Уровни логирования — от менее к более важному:
| Уровень | Когда использовать |
|---|---|
TRACE | максимально подробная диагностика, обычно выключена |
DEBUG | детали для разработчика, помогают в отладке |
INFO | обычные события приложения (“заказ создан”, “сервис запущен”) |
WARN | что-то подозрительное, но не критично |
ERROR | реальная проблема, требует внимания |
Зачем {} вместо конкатенации строк. log.info("user " + userId) всегда строит строку, даже если уровень INFO отключён в конфигурации. log.info("user {}", userId) строит строку только если уровень действительно включён — экономит производительность, особенно для DEBUG/TRACE, которые часто отключены в проде.
Конфигурация Logback (logback.xml) определяет, куда писать логи (консоль, файл, и то и другое), какой уровень показывать, формат строки. В проде обычно настраивают ротацию файлов (старые логи архивируются/удаляются автоматически), чтобы диск не переполнился.
• уровни логирования и зачем `{}` вместо конкатенации строк (если дошёл до 2-го слоя).