Получить доступ

Почему в логировании предпочитают log.debug("user {} order {}", userId, orderId) вместо конкатенации строк?

MiddleТестирование и логирование
Коротко

Отложенное форматирование: строка собирается, только если уровень включён. Конкатенация вычисляется до вызова всегда — на горячем пути с выключенным debug это лишние аллокации.

  • Дорогой аргумент всё равно вычисляется — isDebugEnabled() или лямбда (SLF4J 2: log.atDebug().addArgument(() -> ...))
  • Исключение — последним аргументом без плейсхолдера: стектрейс сохранится
  • Структурное логирование: ключ-значение для поиска в ELK

А ещё Не логировать персональные данные и секреты

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

Конкатенация вычисляется до вызова метода, поэтому строка собирается всегда, даже если сообщение будет отброшено — на горячем пути с отключённым debug это лишние аллокации без всякой пользы. Плейсхолдеры переносят форматирование внутрь, где оно выполняется только при необходимости. Если аргумент сам по себе дорог (сериализация объекта), помогает либо проверка isDebugEnabled, либо API с поставщиком в современных библиотеках. Автоматической защиты данных плейсхолдеры не дают: за то, чтобы в лог не попали пароли, токены и персональные данные, отвечает автор кода. И полезная привычка — писать структурированные логи с correlation id, чтобы записи можно было связать в цепочку.

Что хотят услышать

  • Причина.
  • Ограничение с дорогими аргументами.

Частые ошибки

  • Логировать целые объекты запроса вместе с секретами.
  • Считать, что плейсхолдеры сами что-то маскируют.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✓Строка собирается только если уровень включён — при выключенном debug конкатенация выполнялась бы впустую на каждом вызове
  • ✗Плейсхолдеры автоматически экранируют персональные данные
  • ✗Конкатенация строк не поддерживается большинством библиотек логирования
  • ✗Так сообщение занимает меньше места в файле лога

Что спросят дальше

  • Когда всё же полезна проверка isDebugEnabled?
  • Что обязательно должно попадать в лог для расследования инцидента?

Разбор темы

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем