log.debug("id=" + user.getId()) — цена включена, даже если DEBUG выключен
Суть: этим вопросом проверяют, различаете ли вы «код скомпилировался и работает» от «код не тратит ресурсы там, где не нужно».
Конкатенация строки в аргументе — это выражение, оно выполняется до вызова log.debug(), независимо от уровня логирования. Если DEBUG выключен на проде, метод логгера сразу вернёт управление, но строка уже собрана: конкатенация, вызовы toString() у объектов, иногда autoboxing.
SLF4J для этого даёт параметризованный вызов: аргументы передаются отдельно, а финальная строка и toString() у них считаются только если уровень включён.
// строка собирается всегда log.debug("id=" + user.getId());
// toString() вызывается // только если DEBUG включён log.debug("id={}", user.getId());
Ловушка глубже, если аргумент не примитив, а объект с дорогим toString() — например сериализация целого DTO в JSON для лога. Тогда цена не в конкатенации строки, а в лишней сериализации на каждый запрос, даже когда DEBUG никто не читает.
Уровень логирования управляет тем, что попадёт в файл, но не тем, что успеет посчитаться до этого момента — если не отдать эту работу самому логгеру.
Тренажёр: 600 вопросов, мок с таймером, план повторов
senior·base — что спрашивают на самом деле
В этом посте были ссылки, но мы их удалили по правилам Сетки