Перейти к основному содержимому

Практика: Логгирование в 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 для баланса.