// Package logging настраивает структурное логирование через log/slog. // // Логгер ставится дефолтным, чтобы пакеты писали slog.Info(...) без // протаскивания логгера через все сигнатуры — в Go это принятое решение. package logging import ( "log/slog" "os" "strings" ) // Setup создаёт корневой логгер и делает его дефолтным. // // LOG_LEVEL — debug | info | warn | error (по умолчанию info); // LOG_FORMAT — text | json (по умолчанию text: читаемо в консоли, // json выбирают, когда логи собирает агрегатор). func Setup() *slog.Logger { opts := &slog.HandlerOptions{Level: levelFromEnv()} var handler slog.Handler if strings.EqualFold(strings.TrimSpace(os.Getenv("LOG_FORMAT")), "json") { handler = slog.NewJSONHandler(os.Stdout, opts) } else { handler = slog.NewTextHandler(os.Stdout, opts) } logger := slog.New(handler) slog.SetDefault(logger) return logger } func levelFromEnv() slog.Level { switch strings.ToLower(strings.TrimSpace(os.Getenv("LOG_LEVEL"))) { case "debug": return slog.LevelDebug case "warn", "warning": return slog.LevelWarn case "error": return slog.LevelError default: return slog.LevelInfo } }