Расскажите о подходах к логированию в Go. Какие библиотеки вы бы выбрали для production и почему?

Ответ

В Go существует несколько подходов к логированию, от встроенных в стандартную библиотеку до высокопроизводительных сторонних решений.

1. Стандартная библиотека

  • log: Простой пакет, подходящий для небольших утилит или примеров.

    • Плюсы: Не требует зависимостей.
    • Минусы: Отсутствие уровней логирования (Info, Debug, Error), нет поддержки структурированного вывода (например, JSON), низкая производительность по сравнению с аналогами.
  • slog (новинка в Go 1.21): Новый пакет в стандартной библиотеке для структурированного логирования.

    • Плюсы: Стандартизированный подход, поддержка уровней, вывод в JSON или текстовом формате, хорошая производительность.
    • Цель: Стать общим стандартом для логирования в экосистеме Go.
      logger := slog.New(slog.NewJSONHandler(os.Stdout, nil))
      logger.Info("User logged in", "user_id", 123, "status", "success")

2. Популярные сторонние библиотеки

  • zap (от Uber): Де-факто стандарт для высокопроизводительных приложений.

    • Плюсы: Очень высокая скорость и низкое потребление памяти. Строго структурированное логирование. Есть два режима: Production (максимальная производительность) и Development (удобный для чтения вывод).
    • Минусы: API может показаться более многословным.
      logger, _ := zap.NewProduction()
      defer logger.Sync() // Важно для сброса буфера
      logger.Info("Failed to process request",
      zap.String("url", "/api/v1/users"),
      zap.Int("attempt", 3),
      )
  • logrus: Одна из самых старых и популярных библиотек.

    • Плюсы: Очень гибкий API с хуками (hooks), которые позволяют отправлять логи в разные системы (Sentry, Logstash). Удобный для чтения вывод по умолчанию.
    • Минусы: В настоящее время находится в режиме поддержки (maintenance mode). Значительно медленнее, чем zap.

Какой выбрать?

  • Для новых проектов (Go 1.21+): Начинать с slog. Это новый стандарт, он мощный и не требует внешних зависимостей.
  • Для высоконагруженных систем (high-performance): zap остается лучшим выбором из-за его непревзойденной производительности.
  • Для простых скриптов: Достаточно стандартного log.
  • Для легаси-проектов: Если logrus уже используется, можно продолжать его поддерживать, но для новых сервисов лучше выбрать slog или zap.