package logger import ( "fmt" "log/slog" "os" "strings" "codespace/pkg/config" ) // New creates a *slog.Logger from the given log configuration. // It also sets the logger as the default slog logger. func New(cfg config.LogConfig) (*slog.Logger, error) { level, err := parseLevel(cfg.Level) if err != nil { return nil, err } opts := &slog.HandlerOptions{Level: level} var handler slog.Handler switch strings.ToLower(cfg.Format) { case "json", "": handler = slog.NewJSONHandler(os.Stdout, opts) case "text": handler = slog.NewTextHandler(os.Stdout, opts) default: return nil, fmt.Errorf("invalid log format %q", cfg.Format) } lg := slog.New(handler) slog.SetDefault(lg) return lg, nil } func parseLevel(value string) (slog.Level, error) { switch strings.ToLower(value) { case "debug": return slog.LevelDebug, nil case "info", "": return slog.LevelInfo, nil case "warn": return slog.LevelWarn, nil case "error": return slog.LevelError, nil default: return slog.LevelInfo, fmt.Errorf("invalid log level %q", value) } }