← Назад к вопросам

Какие знаешь пакеты для логирования в Go?

2.3 Middle🔥 201 комментариев
#Observability#Основы Go

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Пакеты для логирования в Go

В Go существует богатая экосистема пакетов для логирования, каждый из которых предлагает различные подходы, уровни абстракции и возможности. Ниже представлен обзор наиболее популярных и эффективных решений.

Стандартные и базовые решения

  1. Стандартный пакет log
    Входит в состав стандартной библиотеки Go. Предоставляет базовые функции для вывода сообщений в стандартный поток ошибок (stderr). Его главные особенности — простота и минимализм, но отсутствие поддержки уровней логирования, форматов и структурного вывода делает его непригодным для сложных проектов.

    import "log"
    
    func main() {
        log.Println("Это базовое сообщение лога")
        log.Fatalf("Ошибка: %s", err) // Выводит сообщение и вызывает exit(1)
    }
    
  2. Пакет fmt для импровизированного логирования
    Часто используется для быстрой отладки через fmt.Println, но не является специализированным инструментом.

Популярные сторонние пакеты

Zap (Uber)

Высокопроизводительный пакет, ориентированный на скорость и минимальные затраты памяти. Идеально подходит для высоконагруженных систем. Предлагает два основных API: Logger (быстрый, но менее удобный) и SugaredLogger (более удобный, с чуть меньшей производиностью).

import "go.uber.org/zap"

func main() {
    logger, _ := zap.NewProduction()
    logger.Info("структурное сообщение",
        zap.String("ключ", "значение"),
        zap.Int("число", 42))
    
    sugared := logger.Sugar()
    sugared.Infof("форматированное сообщение: %s", "значение")
}

Logrus

Один из исторически самых популярных пакетов, предоставляющий богатый API, структурное логирование (log entries как JSON), поддержку хуков (hooks) для расширения и интеграции. Хотя его популярность немного снизилась после прекращения активного развития, он остается надежным выбором.

import log "github.com/sirupsen/logrus"

func main() {
    log.SetFormatter(&log.JSONFormatter{})
    log.WithFields(log.Fields{
        "user": "ivan",
        "action": "login",
    }).Info("Событие пользователя")
}

zerolog

Пакет, который фокусируется на минимализме и нулевых аллокациях памяти (zero-allocation) в горячих путях. Предоставляет чисто структурный вывод (например, в JSON) и часто используется вместе с zap как альтернатива для максимальной производительности.

import "github.com/rs/zerolog/log"

func main() {
    log.Info().Str("ключ", "значение").Msg("структурное сообщение")
}

Пакеты с поддержкой контекста и интеграции

Стандартный context с логерами

Современные логеры часто поддерживают интеграцию с контекстом (context.Context) для передачи метаданных (например, ID запроса, идентификаторы пользователей) через цепочку вызовов.

// Пример с zap и context
ctx := context.WithValue(context.Background(), "requestID", "abc123")
logger.With(zap.String("requestID", "abc123")).Info("обработка запроса")

Экосистемные и универсальные решения

  • glog (Google) — пакет от Google, предлагающий уровни логирования и интеграцию с флагами (flags), но менее популярный в открытых проектах.
  • apex/log — пакет с поддержкой структурного вывода и интеграцией с различными обработчиками (handlers).
  • go-kit/log — часть фреймворка Go Kit, ориентированная на микросервисы и middleware подход. Поддерживает composable логирование.

Критерии выбора пакета

При выборе пакета для логирования следует учитывать:

  • Производительность: для high-load систем выбирайте zap или zerolog.
  • Структурное логирование: необходимо для интеграции с системами мониторинга (например, ELK Stack) — zap, logrus, zerolog.
  • Расширяемость: поддержка хуков (hooks) для отправки логов в внешние системы (Slack, Sentry) — logrus.
  • Интеграция с контекстом: важна для микросервисов и распределенных систем.
  • Простота и скорость разработки: иногда стандартный log или fmt достаточны для прототипов.

В современных проектах я чаще всего рекомендую Zap за его баланс производительности, удобства и активного развития. Для проектов, где уже используется Go Kit, естественным выбором будет go-kit/log. В конечном счете, выбор зависит от конкретных требований проекта к скорости, структуре логов и экосистеме.