slog для structured logging
Тема дорожной карты · Golang
Структурированное логирование в Go — практика вывода записей журнала в виде машиночитаемых пар ключ-значение (как правило, JSON), а не произвольного текста, что позволяет платформам агрегации логов — Loki, Elasticsearch, Splunk — индексировать и запрашивать данные в масштабе. Три доминирующих библиотеки структурированного логирования в Go — log/slog (встроен в Go 1.21+), Zap от Uber (go.uber.org/zap) и Logrus (github.com/sirupsen/logrus), — каждая предлагает JSON-вывод, фильтрацию по уровням и прикрепление полей через различные API. Структурированное логирование в Go должно всегда распространять context.Context через цепочки вызовов, чтобы идентификаторы трассировки из спанов OpenTelemetry и request ID, вставленные HTTP-middleware, автоматически включались в каждую запись журнала без ручной передачи. zap.Logger и zap.SugaredLogger из Zap — наиболее производительный выбор для структурированного логирования в Go: zap.New с zapcore.JSONEncoder создаёт JSON-логи с нулевым выделением памяти даже при высокой нагрузке, тогда как slog предлагает стандартизированный API без внешних зависимостей. Внедрение структурированного логирования в Go с первого дня проекта предотвращает хаос форматов логов, делающий отладку распределённых Golang-сервисов в Kubernetes трудозатратной.
Как это работает
slog для structured logging строится на log/slog (структурированное логирование, 1.21+), Prometheus-клиенте (github.com/prometheus/client_golang), OpenTelemetry Go SDK для traces + metrics. net/http/pprof экспонирует профили на отдельном порту. expvar — лёгкая альтернатива Prometheus для простых счётчиков. Cross-cutting concern: пробрасывайте context.Context везде — trace ID распространяются автоматически.
Когда применять
slog — для всего нового логирования: встроен, JSON из коробки, level-aware. Prometheus /metrics — на каждый сервис с первого дня. OpenTelemetry tracing — когда сервисов больше одного. /debug/pprof/* — на admin-порт, IP-restricted, за load balancer.
Типичные ошибки
Ловушки slog для structured logging: логирование через fmt.Println вместо slog (неструктурированно, дорого запрашивать); экспозиция /debug/pprof в публичный интернет (огромная утечка инфы + DoS-вектор); high-cardinality Prometheus-labels (request-id, user-id — Prometheus давится); нет sampling traces — backend перегружен.