Логирование для Go (Golang): лучшие решения
Логирование — одна из ключевых задач при разработке любого серьёзного приложения на Go. Правильно настроенное логирование позволяет быстро находить ошибки, анализировать производительность и отслеживать поведение системы в продакшене. В этой статье мы разберём самые популярные и современные библиотеки для логирования в Go, их сильные и слабые стороны, а также приведём практические примеры кода.
Зачем нужно логирование в Go?
В отличие от простого вывода в консоль, промышленное логирование требует:
- Структурированности — вывод в формате JSON для удобной интеграции с системами сбора логов (ELK, Grafana Loki, Datadog);
- Уровней логирования — debug, info, warn, error, fatal;
- Производительности — минимальное влияние на скорость работы приложения;
- Контекста — добавление метаданных (ID запроса, имя пользователя, имя функции).
Стандартная библиотека log не поддерживает структурированный вывод и уровни, поэтому разработчики Go активно используют сторонние решения.
1. log/slog — стандартный пакет Go 1.21
Начиная с версии Go 1.21, в стандартную библиотеку был добавлен пакет log/slog. Он предоставляет структурированное логирование «из коробки» и не требует установки дополнительных зависимостей.
Преимущества:
- Официальная поддержка от разработчиков Go;
- Гибкая настройка через
Handler(JSON, текстовый, кастомный); - Встроенные уровни (
Debug,Info,Warn,Error); - Поддержка контекста и групп атрибутов.
Пример использования:
package main
import (
"log/slog"
"os"
)
func main() {
// JSON-логгер
logger := slog.New(slog.NewJSONHandler(os.Stdout, nil))
logger.Info("Сервер запущен", "port", 8080, "env", "production")
// Текстовый логгер с уровнем Debug
textLogger := slog.New(slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{
Level: slog.LevelDebug,
}))
textLogger.Debug("Отладка подключения", "ip", "192.168.1.1")
}
Если вы начинаете новый проект на Go 1.21+, slog — лучший выбор для большинства задач.
2. zerolog — максимальная производительность
Библиотека zerolog (github.com/rs/zerolog) известна своей исключительной скоростью. Она использует zero-аллокации для форматирования JSON, что делает её одной из самых быстрых в экосистеме Go.
Особенности:
- Минимальное выделение памяти (zero allocation);
- Уровни логирования: trace, debug, info, warn, error, fatal, panic;
- Цепочка методов для добавления полей;
- Поддержка цветного вывода в консоль.
Пример:
package main
import (
"github.com/rs/zerolog"
"github.com/rs/zerolog/log"
)
func main() {
zerolog.TimeFieldFormat = zerolog.TimeFormatUnix
log.Info().Str("service", "api").Int("status", 200).Msg("Запрос обработан")
// Уровень Error с стектрейсом
log.Error().Err(err).Str("method", "GET").Msg("Ошибка запроса")
}
Когда выбрать zerolog: если производительность критична (высоконагруженные микросервисы, API с миллионами запросов).
3. zap — мощный и быстрый от Uber
Библиотека zap (go.uber.org/zap) — ещё один лидер по производительности. Разработана в Uber для внутренних нужд, но стала стандартом де-факто для многих Go-проектов.
Ключевые возможности:
- Два режима:
Logger(медленнее, удобнее) иSugaredLogger(быстрее, с форматированием); - Автоматическое определение вызывающей функции и файла;
- Поддержка
zapcoreдля кастомных кодировщиков и выводов; - Готовая интеграция с HTTP-серверами.
Пример:
package main
import (
"