Карта / Логирование / SLF4J + Logback

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) определяет, куда писать логи (консоль, файл, и то и другое), какой уровень показывать, формат строки. В проде обычно настраивают ротацию файлов (старые логи архивируются/удаляются автоматически), чтобы диск не переполнился.

🎤 Закрыл тему, если можешь объяснить:
• зачем нужны библиотеки логирования вместо `System.out.println`;
• уровни логирования и зачем `{}` вместо конкатенации строк (если дошёл до 2-го слоя).