zap, logrus

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

Zap и Logrus — две наиболее широко используемые сторонние библиотеки структурированного логирования в Golang-экосистеме, обе производящие JSON-записи журнала, интегрирующиеся с конвейерами агрегации логов в Kubernetes-развёртываниях. Zap (go.uber.org/zap) разработан для нулевого выделения памяти: zap.NewProduction() создаёт production-ready JSON-логгер, а logger.Info("request handled", zap.String("path", r.URL.Path), zap.Int("status", 200)) выводит структурированную запись без единого выделения в куче, делая Zap предпочтительным выбором для высоконагруженных Golang-сервисов, где задержка логирования имеет значение. Logrus (github.com/sirupsen/logrus) использует API цепочки полей — logrus.WithFields(logrus.Fields{"user": id, "action": "login"}).Info("auth event"), — более привычный разработчикам из мира Python или Ruby, но требующий больше выделений памяти, чем Zap; Logrus поддерживает подключаемые форматтеры и хуки для отправки логов в удалённые приёмники. И Zap, и Logrus интегрируются с context.Context для извлечения идентификаторов трассировки OpenTelemetry и их распространения в записи журнала, обеспечивая корреляцию лог-трейс, которая делает отладку распределённых Golang-сервисов практичной. Начиная с Go 1.21, log/slog в стандартной библиотеке покрывает большинство случаев использования, ранее требовавших Zap или Logrus, но обе библиотеки остаются актуальными для команд с существующими кодовыми базами или нуждающихся в зрелой экосистеме форматтеров, хуков и интеграций с Grafana Loki.

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

zap, logrus строится на 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.

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

Ловушки zap, logrus: логирование через fmt.Println вместо slog (неструктурированно, дорого запрашивать); экспозиция /debug/pprof в публичный интернет (огромная утечка инфы + DoS-вектор); high-cardinality Prometheus-labels (request-id, user-id — Prometheus давится); нет sampling traces — backend перегружен.

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

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