Перейти к содержимому
ГоМастер

Поиск по урокам

Найдите урок, курс, термин или раздел

zap или slog: чем логировать в Go

slog (stdlib с Go 1.21) — дефолт для новых проектов: интерфейс в стандартной библиотеке и экосистема хендлеров. zap Uber — максимум производительности и богатые ядра/сэмплеры, когда логи становятся инфраструктурой.

slogzapкурс

Подбор под ваши приоритеты

Двигайте ползунки — насколько для вас важен каждый критерий (0 — не важен, 5 — критично). Счёт пересчитывается на лету: это взвешенное среднее оценок библиотек по критериям, а не бенчмарк.

Аллокации и скорость записи

Нет зависимостей, единый интерфейс

Ядра, сэмплеры, энкодеры

Сахар против строгих полей

Взвешенный счёт

  • zapваш матч75
  • slog70

Под ваши веса лидирует zap: высоконагруженные сервисы, где логи — часть slo и бюджета cpu.

Выбор логгера в 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.

Одна и та же задача в каждой библиотеке

Задача-эталон для этого сравнения: посмотрите на разницу в церемониях, типах и обработке ошибок — так выбор ощущается, а не только описывается словами.

Структурное логирование в стандартной библиотеке с Go 1.21

package main

import (
  "log/slog"
  "os"
)

func main() {
  logger := slog.New(slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{
    Level: slog.LevelInfo,
  }))
  slog.SetDefault(logger)

  slog.Info("заказ создан",
    slog.String("id", "ord-42"),
    slog.Int("amount", 990),
  )

  // Группы и контекст:
  log := slog.With("service", "billing")
  log.Warn("повторная попытка", "attempt", 2)
}

Сильные и слабые стороны

slog

Структурное логирование в стандартной библиотеке с Go 1.21

  • Ноль зависимостей: интерфейс живёт в stdlib и понимается всей экосистемой
  • Переносимость: хендлер можно заменить (в том числе на zap-адаптер) без переписывания
  • Понятные уровни и атрибуты — Group и With упрощают контекст
  • Меньше настроек энкодеров и маршрутизации «из коробки»
  • Без сэмплирования — защита от флуда пишется руками

Берите, если: новые проекты и сервисы, где логи — обычный поток, а не горячий путь.

zap

Логгер Uber: zero-allocation поля, ядра, сэмплеры и атомарные уровни

  • Максимальная скорость: Field API без рефлексии и аллокаций
  • zapcore: ядра, tee, кастомные энкодеры и маршрутизация записей
  • Сэмплеры и атомарные уровни — защита потока и живая настройка
  • Внешняя зависимость и собственный API поверх stdlib
  • Field API многословнее — часть проектов живёт на Sugared

Берите, если: высоконагруженные сервисы, где логи — часть slo и бюджета cpu.

Оценки по критериям

Шкала 1-5: экспертная оценка команды проекта по практике, а не синтетика.

Сравнение slog, zap по критериям
Критерийslogzap
ПроизводительностьАллокации и скорость записи
Близость к stdlibНет зависимостей, единый интерфейс
Возможности движкаЯдра, сэмплеры, энкодеры
Удобство вызововСахар против строгих полей

Вердикт: когда что выбирать

Это не конкуренты, а разные уровни абстракции: slog — интерфейс стандартной библиотеки, zap — высокопроизводительный движок, который может работать под этим интерфейсом через адаптер. Начинайте со slog и двигайтесь к zap по факту требований, а не по моде.

Новый сервис без особых требований к логамslogStdlib, ноль зависимостей, лёгкая миграция на движок позже
Миллионы записей, сэмплирование, несколько приёмниковzapZero-allocation поля, zapcore и сэмплеры — из коробки
Гибрид: код хочет slog, продакшен хочет zapslog + zap-хендлерАдаптеры (zapr) подставляют zap под стандартный интерфейс

А что выбрали вы?

Кликните по своему выбору — голос сохранится только в вашем браузере (персональные данные никуда не отправляются).

Частые вопросы

Чем slog отличается от log из стандартной библиотеки?

Старый log пишет одну строку без структуры. slog добавляет уровни (Debug/Info/Warn/Error), структурированные атрибуты (ключ=значение) и хендлеры, которые форматируют записи в JSON или текст. Это делает логи машинно-читаемыми для Loki, ELK и подобных систем.

Можно ли использовать zap через интерфейс slog?

Да. Существуют адаптеры, например zapr из экосистемы go-logr: они реализуют slog-хендлер поверх zap-логгера. Код остаётся на slog.Info, а движком и форматированием управляет zap.

Почему zap быстрее стандартного логгера?

zap хранит поля в виде типизированных zap.Field вместо fmt-форматирования, переиспользует буферы и собирает запись без рефлексии. В hot-path логировании это экономит и время, и аллокации, что видно в профилях высоконагруженных сервисов.

Что выбрать новичку для учебного проекта?

slog: ничего устанавливать не нужно, уровни и атрибуты изучаются за один вечер, а при переходе на zap знания переносятся, потому что концепции уровней и полей одинаковы.

Другие сравнения