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 — что спрашивают на самом деле


В этом посте были ссылки, но мы их удалили по правилам Сетки