Какие библиотеки для логирования в 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.

Ответ 18+ 🔞

А, слушай, про логирование в Go, да? Ну это ж классика, вечный спор, какую библиотеку впендюрить в проект, чтобы потом не орать "нахуя я это выбрал, блядь?". Давай разберём, что есть, а то народ безмозглый, в пизду, первую попавшуюся хватает.

Ну, первое, что под руку попадётся — это встроенный log. Простой, как три копейки, из коробки. Плюсы? Да похуй, он есть всегда. Минусы? Овердохуища минусов! Ни уровней, ни JSON, нихуя. Для скрипта, который раз в год запускаешь — сойдёт. Для серьёзного дела? Да ты что, жопа с ручками, это же медленно и бесполезно.

import "log"
log.Printf("Запущена операция с ID: %d", 123)

Дальше, внимание, ёпта! В Go 1.21 завезли slog, прямо в стандартную библиотеку. Вот это поворот, блядь! Теперь не надо искать сторонние костыли. Быстрый, структурированный, с уровнями. Для новых проектов — идеально, манна небесная! Минусы? Да появился недавно, вот и всё.

import "log/slog"
slog.Info("Пользователь залогинился", "user_id", 123, "status", "success")

А теперь, сука, легенда — logrus. Этого деда все знают. Гибкий, как гуттаперчевый мальчик, куча хуков, чтобы логи в Sentry или Logstash пихать. API знакомое, с полями работает. Но, блядь, медленный он, как черепаха в сиропе! Если производительность не ебёт — бери, не прогадаешь.

import "github.com/sirupsen/logrus"
logrus.WithFields(logrus.Fields{
  "user_id": 123,
}).Info("Пользователь обновил профиль")

Дальше — тяжёлая артиллерия. zap от Uber. Эти ребята, блядь, с ума сошли на скорости. Сделали такую библиотеку, что память почти не жрёт, а летает, как угорелая. Есть два режима: sugared (попроще) и основной (для фанатиков скорости). Минус? API у них, блядь, местами такой, что мозг сломать можно. Но если сервис под высокой нагрузкой — выбор очевиден.

import "go.uber.org/zap"
logger, _ := zap.NewProduction()
defer logger.Sync()
logger.Info("Запрос успешно обработан", zap.String("url", "/api/v1"))

И на закуску — zerolog. Ещё один скорострел, который помешан на JSON и нулевом выделении памяти. API у него, вротберунчик, простой и элегантный. По умолчанию всё в JSON пишет. Но гибкости, как у logrus, от него не жди — он заточен под скорость и простоту.

import "github.com/rs/zerolog/log"
log.Info().Str("service", "billing").Msg("Платеж обработан")

Итог, ёпта! Как выбирать-то?

  • Пишешь скриптик на коленке? Бери log и не парься.
  • Новый проект на свежем Go? slog, без вариантов, это новый стандарт, блядь.
  • Нужны хуки и гибкость, а скорость не критична? logrus, старый добрый друг.
  • Делаешь high-load сервис, где каждый микросекунд на счету? Либо zap, либо zerolog. Выбирай по вкусу API, оба — охуенно быстрые.

Вот так вот, на хуй. Главное — не тыкать в проект первую попавшуюся библиотеку, а то потом будешь, как Герасим, молча страдать и переписывать всё, блядь.