Что такое пакет `slog` в Go и какие проблемы он решает?

Ответ

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

Основная проблема, которую решает slog, — это создание логов, которые легко читать не только человеку, но и машине (системам сбора и анализа логов, таким как ELK Stack, Grafana Loki, Datadog).

Ключевые особенности и преимущества:

  • Уровни логирования: Встроенная поддержка уровней (Debug, Info, Warn, Error), что позволяет гибко настраивать детализацию логов для разных окружений.
  • Структурированный вывод: Логи по умолчанию выводятся в виде пар ключ=значение или в формате JSON. Это упрощает их парсинг, фильтрацию и индексацию.
  • Контекстная информация: Возможность добавлять атрибуты к логгеру, которые будут присутствовать во всех последующих сообщениях. Отлично интегрируется с context.Context.
  • Высокая производительность: slog разработан с упором на минимизацию аллокаций и накладных расходов, что делает его одним из самых быстрых решений для логирования в Go.
  • Гибкая настройка: Позволяет легко заменять обработчик (Handler) для изменения формата вывода (например, JSON, logfmt) или направления (stdout, файл, сетевое хранилище).

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

package main

import (
    "log/slog"
    "os"
)

func main() {
    // Создаем логгер с обработчиком, который пишет JSON в stdout
    logger := slog.New(slog.NewJSONHandler(os.Stdout, nil))

    // Логируем событие с дополнительными атрибутами
    logger.Info("user logged in",
        slog.Int("user_id", 12345),
        slog.String("ip_address", "192.168.1.101"),
    )
}

Пример вывода (JSON):

{"time":"2023-10-27T10:00:00.000Z","level":"INFO","msg":"user logged in","user_id":12345,"ip_address":"192.168.1.101"}

В целом, slog становится стандартом для логирования в современных Go-приложениях, заменяя сторонние библиотеки во многих проектах.