Что такое структурированное логирование и какие инструменты для этого есть в Go?

Ответ

Структурированное логирование — это практика записи логов в виде последовательности пар ключ-значение (чаще всего в формате JSON), а не в виде простого текста. Это делает логи машиночитаемыми, что кардинально упрощает их поиск, фильтрацию, агрегацию и анализ с помощью специализированных систем, таких как ELK Stack (Elasticsearch, Logstash, Kibana), Grafana Loki или Splunk.

Стандартная библиотека: slog (Go 1.21+)

Начиная с версии Go 1.21, в стандартную библиотеку был добавлен пакет slog для структурированного логирования.

import (
    "log/slog"
    "os"
)

func main() {
    logger := slog.New(slog.NewJSONHandler(os.Stdout, nil))

    logger.Info(
        "Пользователь выполнил вход",
        "user_id", 12345,
        "action", "login",
        "status", "success",
    )
}

Вывод:

{"time":"2023-10-27T10:00:00.000Z","level":"INFO","msg":"Пользователь выполнил вход","user_id":12345,"action":"login","status":"success"}

Популярные сторонние библиотеки:

  • sirupsen/logrus: Один из самых популярных и старых пакетов. Имеет хуки для интеграции с различными сервисами.
  • uber-go/zap: Разработан в Uber с упором на максимальную производительность и минимальные аллокации памяти.

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

  • Машиночитаемость: Легко парсить и индексировать.
  • Контекстуальность: Позволяет добавлять к сообщению произвольные поля с контекстом (ID пользователя, ID трассировки и т.д.).
  • Централизация и анализ: Упрощает сбор логов из разных сервисов в одном месте и их последующий анализ.