Ответ
В Go существует несколько популярных библиотек для логирования, каждая со своими сильными сторонами.
-
log(стандартная библиотека) Простой и встроенный в Go пакет. Не требует установки зависимостей.- Плюсы: Простота, доступность "из коробки".
- Минусы: Ограниченный функционал: нет уровней логирования (info, debug, error), нет структурированных логов (JSON), низкая производительность.
import "log" log.Printf("Запущена операция с ID: %d", 123)
-
slog(стандартная библиотека, Go 1.21+) Новый официальный пакет для структурированного логирования, добавленный в Go 1.21.- Плюсы: Встроен в стандартную библиотеку, высокая производительность, поддержка уровней логирования и структурированных логов (JSON, key-value).
- Минусы: Появился относительно недавно.
import "log/slog" slog.Info("Пользователь залогинился", "user_id", 123, "status", "success")
-
logrusДолгое время был одной из самых популярных библиотек. Полностью совместим с API стандартногоlog.- Плюсы: Очень гибкий, поддерживает хуки (hooks) для отправки логов во внешние системы (Sentry, Logstash), форматирование (JSON, text), уровни логирования.
- Минусы: Медленнее, чем
zapилиzerolog.import "github.com/sirupsen/logrus" logrus.WithFields(logrus.Fields{ "user_id": 123, }).Info("Пользователь обновил профиль")
-
zapРазработан Uber с упором на максимальную производительность и минимальное выделение памяти.- Плюсы: Очень быстрый, структурированное логирование, есть два режима:
sugared(более удобный API) и основной (максимально быстрый). - Минусы: API может показаться более сложным, чем у
logrus.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 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, оба — охуенно быстрые.
Вот так вот, на хуй. Главное — не тыкать в проект первую попавшуюся библиотеку, а то потом будешь, как Герасим, молча страдать и переписывать всё, блядь.