Логирование в Go (Golang): лучшие библиотеки и решения для продакшена

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Логирование для 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 (
    "                    

Рекомендаций