Уровни журналирования и атрибуты
Добавляйте контекст в журналы
«Уровни журналирования и атрибуты» — бесплатный урок 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 — локальная установка не требуется.
Все уроки этого курса
- Зачем нужны структурированные журналы
- Обработчики slog
- Уровни журналирования и атрибуты
- Пользовательские обработчики