log/slog

Тема дорожной карты · Golang

Структурированное логирование с slog появилось в Go 1.21 как первый официальный API структурированного логирования в стандартной библиотеке, предоставляя slog.Logger, slog.Handler и функции верхнего уровня slog.Info, slog.Warn, slog.Error и slog.Debug для вывода записей журнала в формате ключ-значение. Пакет log/slog поставляется с двумя встроенными обработчиками — slog.NewTextHandler для человекочитаемого вывода и slog.NewJSONHandler для машиночитаемого JSON, — что делает его заменой сторонних библиотек Zap и Logrus во многих Golang-проектах. slog.With прикрепляет постоянные атрибуты (например, request_id или trace_id) к экземпляру логгера, обеспечивая контекстно-богатое структурированное логирование без повторения полей в каждом вызове. Структурированное логирование с slog интегрируется с context.Context через slog.Default().InfoContext(ctx, ...), так что идентификаторы трассировки OpenTelemetry могут автоматически включаться в строки журнала. Переход на log/slog является рекомендуемым подходом для новых Golang-сервисов, поскольку он устраняет внешние зависимости, обеспечивая структурированное логирование наравне с Zap и Logrus.

Как это работает

log/slog знаменита batteries-included: net/http (production-уровневый HTTP клиент + сервер), encoding/json/xml/csv (сериализация), database/sql (интерфейс — в паре с драйвером типа pgx, go-sql-driver/mysql), os + os/exec + io/fs (файлы, процессы), crypto/* (хеширование, шифры, TLS), context (cancellation + значения), time, regexp, text/template / html/template, log/slog (структурированное логирование, 1.21+).

Когда применять

По умолчанию stdlib — большинство, к чему тянутся в npm/pip других языков, уже в Go-stdlib. log/slog — для нового логирования (заменяет log + logrus + zap для большинства нужд). net/http-сервер напрямую — пока реально не нужен фреймворк. database/sql + драйвер — вместо ORM, кроме случая многих тривиальных CRUD-эндпойнтов.

Типичные ошибки

Ловушки log/slog: свой HTTP-роутинг вместо net/http.ServeMux (route patterns в 1.22 — достаточно для многих приложений); игнор http.Server.ReadTimeout и WriteTimeout (slowloris / hung-connection уязвимости); time.Now() прямо в тестах (мок через интерфейс или clockwork); json.Marshal неэкспортированных полей struct (тихо ноль — пишите с заглавной или используйте json:"...").

Связанные понятия

Полезные ресурсы