Логирование для Go (Golang): лучшие решения и инструменты
Логирование — одна из ключевых составляющих любого production-приложения на Go. Оно помогает отслеживать ошибки, анализировать поведение системы и проводить аудит. В Go существует множество библиотек для логирования, каждая со своими особенностями, производительностью и удобством. В этой статье мы рассмотрим лучшие решения: от стандартного пакета log до высокопроизводительных zap и zerolog, а также новый стандарт slog.
1. Стандартный пакет log
Встроенный пакет log — самый простой способ начать логировать в Go. Он не требует установки сторонних зависимостей и подходит для небольших проектов или быстрого прототипирования.
Особенности:
- Минималистичный API:
Print,Printf,Println,Fatal,Panic. - Поддержка префиксов и флагов (дата, время, файл).
- По умолчанию выводит в
os.Stderr. - Не поддерживает структурированное логирование «из коробки».
package main
import "log"
func main() {
log.Println("Это простое сообщение")
log.Printf("Пользователь %s вошёл в систему", "admin")
log.Fatal("Критическая ошибка — приложение завершится")
}
Когда использовать: для скриптов, утилит, тестов или когда не нужны сложные форматы.
2. logrus — структурированное логирование
Logrus — одна из самых популярных библиотек для Go. Она предоставляет структурированное логирование с поддержкой уровней, полей и форматирования (JSON, текст).
Особенности:
- Уровни: Trace, Debug, Info, Warn, Error, Fatal, Panic.
- Поддержка хуков (hooks) для отправки логов в сторонние сервисы.
- Гибкое форматирование: TextFormatter, JSONFormatter.
- Возможность добавлять контекстные поля.
package main
import (
"github.com/sirupsen/logrus"
)
func main() {
log := logrus.New()
log.SetFormatter(&logrus.JSONFormatter{})
log.WithFields(logrus.Fields{
"user": "admin",
"ip": "192.168.1.1",
}).Info("Пользователь авторизован")
}
Недостаток: производительность ниже, чем у более новых библиотек (zap, zerolog).
3. zap — сверхбыстрое логирование от Uber
Zap от Uber — это библиотека с фокусом на максимальную производительность. Она использует отражение (reflection) только при необходимости и предлагает два режима: SugaredLogger (удобный, медленнее) и Logger (быстрый, требует строгой типизации).
Особенности:
- Очень высокая скорость: до 10 раз быстрее logrus.
- Поддержка структурированного логирования с полями.
- Гибкая настройка: уровни, вывод в файл/консоль, ротация.
- Безопасность: не аллоцирует память в горячем пути.
package main
import (
"go.uber.org/zap"
)
func main() {
logger, _ := zap.NewProduction()
defer logger.Sync()
logger.Info("Сервер запущен",
zap.String("port", "8080"),
zap.Int("workers", 10),
)
}
Когда использовать: высоконагруженные микросервисы, системы реального времени.
4. zerolog — минимализм и производительность
Zerolog — ещё одна высокопроизводительная библиотека, которая делает упор на нулевые аллокации и простоту. Она поставляется с отличной документацией и встроенной поддержкой JSON по умолчанию.
Особенности:
- Минимальные аллокации памяти.
- Поддержка уровней, полей, суб-логгеров.
- Встроенный pretty-printing для разработки.
- Поддержка контекста (context.Context).
package main
import (
"github.com/rs/zerolog"
"github.com/rs/zerolog/log"
)
func main() {
zerolog.TimeFieldFormat = zerolog.TimeFormatUnix
log.Info().
Str("service", "auth").
Int("attempt", 3).
Msg("Ошибка аутентификации")
}
Когда использовать:
Также в библиотеке
Рекомендаций