0Pricing
Go Academy · Урок

Уровни журналирования и атрибуты

Добавляйте контекст в журналы

«Уровни журналирования и атрибуты» — бесплатный урок Go Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Go Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Go Academy содержит 4 уроков всего.

Добавление контекста в журналы

Простое сообщение сообщает, что произошло; атрибуты сообщают подробности, делающие журналы полезными для действий: какой пользователь, какой запрос и сколько времени он занял.

Четыре уровня

Уровни slog от наименьшей к наибольшей серьёзности:

  • Debug (-4)
  • Info (0)
  • Warn (4)
  • Error (8)

Уровни являются целыми числами, поэтому между ними можно определить собственные уровни.

Фильтрация по уровню

Задайте минимальный уровень в HandlerOptions. Записи ниже него отбрасываются без лишних затрат.

package main

import (
    "log/slog"
    "os"
)

func main() {
    opts := &slog.HandlerOptions{Level: slog.LevelWarn}
    logger := slog.New(slog.NewTextHandler(os.Stdout, opts))
    logger.Info("ignored")
    logger.Warn("shown")
}

Типизированные атрибуты

Помимо обычных аргументов «ключ–значение», slog предлагает типизированные конструкторы, которые помогают избежать ошибок и работают быстрее:

  • slog.String("k", v)
  • slog.Int("k", v)
  • slog.Bool("k", v)
  • slog.Duration("k", d)
slog.Info("done", slog.String("phase", "build"), slog.Int("files", 12))

Зачем нужны типизированные Attrs

Типизированные атрибуты позволяют обнаружить ошибку «нечётное число аргументов» во время компиляции и дают обработчику возможность не использовать отражение. Предпочитайте их на часто выполняемых участках.

Группировка атрибутов

slog.Group объединяет связанные поля под одним ключом.

slog.Info("req",
    slog.Group("http",
        slog.String("method", "GET"),
        slog.Int("status", 200),
    ),
)

Logger.With для общего контекста

logger.With(...) возвращает дочерний логгер, который добавляет одни и те же атрибуты к каждому сообщению. Это идеально подходит для идентификатора запроса.

reqLog := logger.With("requestID", "abc-123")
reqLog.Info("started")
reqLog.Info("finished")

Журналирование с учётом контекста

Варианты *Context (например, InfoContext) передают context.Context, позволяя обработчикам извлекать идентификаторы трассировки.

slog.InfoContext(ctx, "handling", "path", "/api")

Динамические уровни

Используйте slog.LevelVar, чтобы менять уровень во время работы программы (например, повышать его до Debug при расследовании инцидента) без перезапуска.

var lvl slog.LevelVar
lvl.Set(slog.LevelInfo)
h := slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{Level: &lvl})
// later: lvl.Set(slog.LevelDebug)

Ошибки как атрибуты

Добавляйте ошибки как атрибуты, чтобы по ним можно было выполнять запросы, вместо того чтобы объединять их с сообщением.

slog.Error("save failed", slog.String("err", err.Error()), slog.Int("retry", 2))

Выполняемая программа: уровни и With

Эта программа фильтрует записи по уровню и использует дочерний логгер с общим контекстом.

package main

import (
    "log/slog"
    "os"
)

func main() {
    opts := &slog.HandlerOptions{Level: slog.LevelInfo}
    base := slog.New(slog.NewTextHandler(os.Stdout, opts))
    req := base.With("requestID", "r-7")
    req.Debug("hidden")
    req.Info("processing", slog.Int("items", 3))
}

Быстрая проверка

Проверьте, насколько хорошо Вы поняли уровни и атрибуты.

Итоги

Вы узнали об уровнях и атрибутах:

  • Четыре встроенных уровня; фильтруйте их с помощью HandlerOptions.Level
  • Типизированные атрибуты (slog.String, slog.Int) надёжнее и быстрее
  • slog.Group объединяет поля, а logger.With передаёт общий контекст
  • LevelVar позволяет менять уровень во время работы программы

Часто задаваемые вопросы

Урок «Уровни журналирования и атрибуты» бесплатный?

Да — полный текст урока «Уровни журналирования и атрибуты» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Go Academy, подпишись на CoddyKit PRO. Курс Go Academy содержит 4 уроков всего.

Чему я научусь в уроке «Уровни журналирования и атрибуты»?

Добавляйте контекст в журналы Ты практикуешь Go Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Go Academy?

Предыдущий опыт не требуется. Go Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.

Сколько времени занимает урок «Уровни журналирования и атрибуты»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Go Academy?

Да. Каждый урок Go Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Зачем нужны структурированные журналы
  2. Обработчики slog
  3. Уровни журналирования и атрибуты
  4. Пользовательские обработчики
← Назад к Go Academy