Что такое логирование в коде
Что проверяют
Умеете ли вы оставлять следы, по которым инцидент разбирается без отладчика на проде. За вопросом стоит не знание API, а привычка думать о том, кто и когда будет читать эту строку.
Как отвечать
Логирование это запись событий выполнения в поток, который переживает сам запрос: файл, вывод контейнера, сборщик логов.
Уровни по возрастанию: TRACE и DEBUG для разработки, INFO для бизнес-событий (заказ создан, задача поставлена в очередь), WARN для восстановимых отклонений (сработал повтор, промахнулся кэш), ERROR для случаев, когда операция не выполнена и нужен человек. Уровень задаёт не громкость, а адресата: ERROR читает дежурный, DEBUG только вы.
В Java пишут через фасад SLF4J, а реализацию (Logback или Log4j 2) подключают зависимостью.
private static final Logger log = LoggerFactory.getLogger(OrderService.class);
log.info("Заказ {} оплачен, сумма {}", orderId, amount);
log.error("Не удалось списать средства по заказу {}", orderId, e);Дальше про эксплуатацию: параметризованные сообщения вместо склейки строк, идентификатор запроса в MDC для сквозной трассировки, машиночитаемый формат для сборщика.
Где спотыкаются
Склеивают сообщение плюсом, и строка собирается даже когда уровень выключен. Фигурные заполнители откладывают форматирование до момента, когда запись действительно нужна, а исключение передаётся последним аргументом без заполнителя, иначе стектрейс в лог не попадёт.
Ловят исключение, пишут его в лог и тут же бросают дальше. Один отказ оседает в файле дважды, а то и трижды, и по логу уже не понять, сколько их было на самом деле. Правило простое: либо обработал и записал, либо прокинул и оставил запись вызывающему.
Кладут в лог персональные данные и секреты: токен, тело запроса с картой, пароль. Логи уезжают во внешнее хранилище и живут там месяцами, так что это уже утечка, а не отладка.