Выбор логгера в Go упростился и усложнился одновременно: с версии 1.21 в стандартной библиотеке появился slog — структурное логирование с уровнями и атрибутами, а заодно «контракт», которому подчиняются сторонние библиотеки. Вопрос «zap или slog» теперь звучит не как «какой логгер лучше», а как «где граница между стандартным интерфейсом и специализированным движком».
slog — это интерфейс и два встроенных хендлера (текстовый и JSON). Его сила в универсальности: приложение логирует через slog.Info с атрибутами, а куда и как эти записи уходят — решает хендлер. Zap-логгер можно подсунуть под slog-интерфейс через адаптеры (например, zapr), и миграция между движками перестаёт быть переписыванием кода. Порог входа минимальный: fmt.Println в учебных проектах меняется на slog.Info без смены архитектуры.
zap остаётся эталоном скорости: Zero-allocation API (zap.Field вместо fmt), отдельное Sugared API для удобства, ядра zapcore для маршрутизации записей, сэмплеры для защиты от флуда и атомарные уровни, меняющиеся на лету. Uber создал его для сервисов, где логи — инфраструктура с SLO: там подсчёт аллокаций и микросекунды на запись имеют значение. В наших курсах zap разобран в 25 уроках — от zapcore до интеграции с logr.
Рекомендация проекта: начинайте со slog — он всегда есть, не тянет зависимости и сохраняет код переносимым. Подключайте zap, когда появляются требования: миллионы записей в минуту, сэмплирование, кастомные энкодеры, маршрутизация в несколько приёмников. Точку перехода легко найти в профиле: если логирование попадает в топ CPU/аллокаций — время zap.