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

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

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

Начать курс

Логирование для 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("Ошибка аутентификации")
}

Когда использовать:

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