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

Что такое Slog?

1.0 Junior🔥 181 комментариев
#Observability#Основы Go

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

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

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

Что такое Slog в Go?

Slog — это новый пакет для структурированного логирования, представленный в стандартной библиотеке Go начиная с версии 1.21. Он был разработан для решения ключевых недостатков традиционного логгера из пакета log, такого как отсутствие структурированности, уровней логирования и гибкости в обработке. Slog является частью официальной стандартной библиотеки, что означает его стабильность, долгосрочную поддержку и отсутствие внешних зависимостей.

Ключевые особенности Slog

  1. Структурированное логирование: В отличие от log.Printf(), который выводит простой текст, Slog позволяет логировать данные в структурированных форматах (например, JSON, текстовом), что облегчает парсинг, фильтрацию и анализ логов инструментами мониторинга (как Elasticsearch, Grafana Loki).

  2. Уровни логирования: Slog поддерживает стандартные уровни:

    • Debug: для отладочной информации.
    • Info: для обычных событий.
    • Warn: для предупреждений.
    • Error: для ошибок.
  3. Гибкость обработчиков (Handlers): Пакет предоставляет интерфейс Handler, позволяющий реализовывать кастомные обработчики. Встроенные обработчики включают TextHandler (для человекочитаемого текста) и JSONHandler (для машинно-ориентированного вывода).

  4. Контекст и атрибуты: Slog интегрируется с контекстом (context.Context), позволяя передавать атрибуты логирования (например, ID запроса) через цепочку вызовов, что упрощает трассировку.

Пример использования Slog

package main

import (
    "log/slog"
    "os"
)

func main() {
    // Создание обработчика для вывода в JSON
    jsonHandler := slog.NewJSONHandler(os.Stdout, nil)
    logger := slog.New(jsonHandler)
    slog.SetDefault(logger) // Установка логгера по умолчанию

    // Логирование с атрибутами
    slog.Info("пользователь вошел в систему",
        "user_id", 123,
        "ip", "192.168.1.1",
    )

    // Использование контекста
    logger.Info("запрос обработан",
        slog.String("method", "GET"),
        slog.Int("status", 200),
    )

    // Логирование ошибки
    logger.Error("не удалось подключиться к БД",
        slog.String("error", "connection timeout"),
    )
}

Преимущества Slog

  • Стандартизация: Поскольку Slog входит в стандартную библиотеку, он становится единым решением для логирования в экосистеме Go, уменьшая фрагментацию (ранее использовались сторонние библиотеки, как zap или logrus).
  • Производительность: Slog оптимизирован для минимальных аллокаций памяти, что критично для высоконагруженных приложений.
  • Интеграция с экосистемой: Легко интегрируется с существующими инструментами мониторинга благодаря структурированному формату (особенно JSON).
  • Гибкость: Поддержка кастомных обработчиков позволяет адаптировать логирование под специфические требования (например, отправка логов в облачные сервисы).

Сравнение с альтернативами

До появления Slog популярными библиотеками были:

  • Zap (Uber): Высокая производительность, но более сложный API.
  • Logrus: Удобный API, но менее производительный.
  • Zerolog: Минималистичный и быстрый, но с ограниченной функциональностью.

Slog сочетает производительность, простоту и стандартизацию, хотя для экстремальных сценариев (например, микросервисы с миллионами запросов в секунду) zap может оставаться выбором из-за тонкой настройки.

Заключение

Slog — это современный, эффективный и структурированный логгер, который решает давние проблемы логирования в Go. Его включение в стандартную библиотеку упрощает разработку, обеспечивает совместимость и снижает зависимость от сторонних решений. Для новых проектов на Go 1.21+ рекомендуется использовать Slog как основное средство логирования, а для существующих — рассмотреть миграцию для улучшения поддерживаемости и интеграции с инструментами observability.