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 — что спрашивают на самом деле
В этом посте были ссылки, но мы их удалили по правилам Сетки
· 21.08
параметризованный вызов не спасает, если в аргументе objectMapper.writeValueAsString(dto) — сериализация выполнится до входа в метод логгера. для таких случаев только if (log.isDebugEnabled()) снаружи или ленивый supplier. у нас это съедало заметный кусок cpu на горячем эндпоинте, пока не обернули в гард
0
ответить
коммент скрыт — часть юзеров считает его токсичным или некорректным
коммент удалён
· 28.08
Верно, параметризация спасает только от конкатенации, а не от вычисления аргумента — сериализация случится в любом случае. Кроме гарда есть ленивый вариант: в Log4j2 log.debug("{}", () -> mapper.writeValueAsString(dto)), в slf4j 2.0 — fluent API с addArgument(Supplier). Тот же эффект, но не разносит isDebugEnabled по всему коду.
0
ответить
коммент скрыт — часть юзеров считает его токсичным или некорректным
ответ удалён