Когда логирование хорошо использовать, а когда лучше не использовать
Что проверяют
Понимаете ли вы, что лог это данные для конкретного читателя, а не привычка писать fmt.Println на каждом шаге. Следом обычно спрашивают, где в Go логировать ошибку: там, где она возникла, или там, где её обработали.
Как отвечать
Логирование нужно там, где без него нельзя восстановить картину событий:
- границы системы: входящий запрос с итогом и длительностью, вызов внешнего сервиса, ошибка, которую уже некуда вернуть;
- смена состояния: старт и остановка сервиса, применённая конфигурация, переключение фича-флага;
- аудит: кто и что поменял, если этого требуют безопасность или регламент.
Инструменты: с Go 1.21 в стандартной библиотеке есть log/slog со структурными полями и уровнями, в проде обычно slog.NewJSONHandler. Из сторонних по-прежнему живы zap и zerolog. Идентификатор запроса и trace id удобно тянуть через context.Context и InfoContext.
Где лог лишний или вреден:
- горячий путь: запись на каждой итерации даёт аллокации и нагрузку на диск. Аргументы вычисляются даже на выключенном уровне, поэтому дорогие поля прячут за
logger.Enabled, а в плотных местах используютLogAttrs; - библиотеки: пакет возвращает ошибку, логирует приложение. Если логгер всё же нужен, его передают параметром как
*slog.Logger; - метрики через логи: число запросов и задержки считают счётчиками и гистограммами в Prometheus, а не грепом по логам;
- секреты и персональные данные: токены, пароли, телефоны. Для маскировки есть интерфейс
slog.LogValuer.
Где спотыкаются
Логируют ошибку и тут же возвращают её наверх. Каждый уровень пишет своё, и одна проблема даёт пять одинаковых записей. Правило: либо обработать и залогировать, либо обернуть через fmt.Errorf("...: %w", err) и вернуть.
Вызывают log.Fatal в глубине кода. Он вызывает os.Exit, отложенные defer не выполняются, соединения и файлы не закрываются.
Пишут неструктурированные строки через конкатенацию. Такие логи не отфильтровать по полям в Loki или Elasticsearch, а поля с высокой кардинальностью, вынесенные в метки Loki, ещё и раздувают индекс.