Какие библиотеки для логирования в Go вы знаете? Сравните их.

Ответ

В Go существует несколько популярных библиотек для логирования, каждая со своими сильными сторонами.

  1. log (стандартная библиотека) Простой и встроенный в Go пакет. Не требует установки зависимостей.

    • Плюсы: Простота, доступность "из коробки".
    • Минусы: Ограниченный функционал: нет уровней логирования (info, debug, error), нет структурированных логов (JSON), низкая производительность.
      import "log"
      log.Printf("Запущена операция с ID: %d", 123)
  2. slog (стандартная библиотека, Go 1.21+) Новый официальный пакет для структурированного логирования, добавленный в Go 1.21.

    • Плюсы: Встроен в стандартную библиотеку, высокая производительность, поддержка уровней логирования и структурированных логов (JSON, key-value).
    • Минусы: Появился относительно недавно.
      import "log/slog"
      slog.Info("Пользователь залогинился", "user_id", 123, "status", "success")
  3. logrus Долгое время был одной из самых популярных библиотек. Полностью совместим с API стандартного log.

    • Плюсы: Очень гибкий, поддерживает хуки (hooks) для отправки логов во внешние системы (Sentry, Logstash), форматирование (JSON, text), уровни логирования.
    • Минусы: Медленнее, чем zap или zerolog.
      import "github.com/sirupsen/logrus"
      logrus.WithFields(logrus.Fields{
      "user_id": 123,
      }).Info("Пользователь обновил профиль")
  4. zap Разработан Uber с упором на максимальную производительность и минимальное выделение памяти.

    • Плюсы: Очень быстрый, структурированное логирование, есть два режима: sugared (более удобный API) и основной (максимально быстрый).
    • Минусы: API может показаться более сложным, чем у logrus.
      import "go.uber.org/zap"
      logger, _ := zap.NewProduction()
      defer logger.Sync()
      logger.Info("Запрос успешно обработан", zap.String("url", "/api/v1"))
  5. zerolog Еще одна высокопроизводительная библиотека, которая фокусируется на генерации логов в формате JSON с нулевым выделением памяти.

    • Плюсы: Экстремально быстрый, простой и понятный API, по умолчанию пишет в JSON.
    • Минусы: Менее гибкий в плане форматирования и хуков по сравнению с logrus.
      import "github.com/rs/zerolog/log"
      log.Info().Str("service", "billing").Msg("Платеж обработан")

Как выбрать?

  • Простые утилиты и скрипты: log.
  • Новые проекты (Go 1.21+): slog — это новый стандарт.
  • Нужна максимальная гибкость и экосистема (хуки): logrus.
  • Критична высокая производительность (high-load сервисы): zap или zerolog.