Практика: Логгирование в Go
Онлайн редактор кода для Go
Здесь вы можете попробовать свои силы в программировании на языке Go. Для этого мы предоставляем вам онлайн редактор кода, в котором вы можете написать свой код и запустить его.
❗️ При обновлении страницы код пропадёт, по этому, сохраните свой код куда-нибудь, если он важный.
Задание 1 — Базовый логгер с настройками
Задание 1: Настраиваемый логгер с флагами
⏱️ Примерное время: 10-15 минутНастрой базовый `log` с префиксом, флагами (дата, время, файл). Запиши несколько сообщений и покажи разницу с/без флагов.
Требования:
- используй
log.SetPrefix,log.SetFlags - запиши 3–5 сообщений: Println, Printf
- покажи вывод с флагами и без (сравни)
Пример вывода:
[APP] 2026/01/07 14:35:22 Сервер запущен
[APP] 2026/01/07 14:35:23 Ошибка: connection refused
Задание 2 — Кастомный логгер в файл + stdout
Задание 2: Логгер в файл и консоль
⏱️ Примерное время: 15-20 минутСоздай кастомный *log.Logger, который пишет и в файл (app.log), и в stdout. Добавь Fatal для критической ошибки.
Требования:
- используй
io.MultiWriter(os.Stdout, file) log.New(multi, "[APP] ", log.LstdFlags)- добавь
log.Fatalдля критической ошибки - проверь файл после выполнения
Пример вывода (и в консоли, и в файле):
[APP] 2026/01/07 14:35:22 App started
[APP] 2026/01/07 14:35:23 User login: alice
[APP] 2026/01/07 14:35:24 Critical error: boom
Задание 3 — slog: структурированный логгер по уровням
Задание 3: Логгер с уровнями и атрибутами
⏱️ Примерное время: 15-20 минутНастрой slog с уровнем по ENV (dev: Debug, prod: Info). Запиши сообщения разных уровней с атрибутами.
Требования:
opts := &slog.HandlerOptions{Level: slog.LevelDebug if dev else Info}logger := slog.New(slog.NewTextHandler(os.Stdout, opts))slog.SetDefault(logger)- запиши 4 сообщения: Debug, Info, Warn, Error с атрибутами
Пример вывода (TextHandler):
time=... level=DEBUG msg="Деталь" detail=42
time=... level=INFO msg="Пользователь" user=alice
time=... level=WARN msg="IP" ip=1.1.1.1
time=... level=ERROR msg="Ошибка" err=boom
Задание 4 — slog с контекстом и JSON
Задание 4: Контекстный логгер в JSON
⏱️ Примерное время: 20-25 минутНастрой slog в JSON-формат. Добавь глобальный контекст (app, version). Создай подлоггер для запроса (request_id).
Требования:
logger := slog.New(slog.NewJSONHandler(os.Stdout, nil)).With("app", "my-service", "version", "1.2.0")reqLog := logger.With("request_id", id)- запиши Info, Warn, Error через подлоггер
Пример вывода (JSON):
{"time":"...","level":"INFO","msg":"Запрос","app":"my-service","version":"1.2.0","request_id":"abc123"}
Задание 5 — Zerolog для высоконагруженного сервиса
Задание 5: Логгер для сервера с zerolog
⏱️ Примерное время: 20-25 минутНастрой zerolog с уровнем Info. Запиши события запроса с атрибутами (method, path, status, latency).
Требования:
log := zerolog.New(os.Stdout).With().Timestamp().Logger()zerolog.SetGlobalLevel(zerolog.InfoLevel)- используй
log.Info().Str("method", "GET").Str("path", "/api").Int("status", 200).Dur("latency", 34*time.Millisecond).Msg("Запрос обработан")
Пример вывода:
{"level":"info","time":1640995200,"method":"GET","path":"/api/users","status":200,"latency":34000000,"message":"Запрос обработан"}
Задание 6 — Zap с sugared и core режимами
Задание 6: Логгер с zap (sugared vs core)
⏱️ Примерное время: 20-25 минутНастрой zap в production-конфиг. Покажи разницу между sugared (удобный) и core (быстрый) логгером на примере события.
Требования:
logger, _ := zap.NewProduction()- sugar:
sugar.Infow(msg, "key", value) - core:
logger.Info(msg, zap.String("key", value)) - покажи вывод обоих и объясни разницу
Пример вывода (JSON):
{"level":"info","ts":1640995200,"caller":"main.go:15","msg":"User login","user":"alice","age":25}
Логи — глаза и уши твоей системы.
Выбирай логгер по нуждам: stdlib для простоты, zerolog/zap для скорости, slog для баланса.