From d206f9281f70c7017deaaab390a865f83e490bdb Mon Sep 17 00:00:00 2001 From: bvandeusen Date: Sat, 18 Apr 2026 21:20:10 +0000 Subject: [PATCH] feat(skel): slog logger factory with text|json format and level parsing --- internal/logging/logging.go | 42 +++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 internal/logging/logging.go diff --git a/internal/logging/logging.go b/internal/logging/logging.go new file mode 100644 index 00000000..d0561466 --- /dev/null +++ b/internal/logging/logging.go @@ -0,0 +1,42 @@ +package logging + +import ( + "fmt" + "io" + "log/slog" + "strings" +) + +func New(w io.Writer, level, format string) (*slog.Logger, error) { + lvl, err := parseLevel(level) + if err != nil { + return nil, err + } + opts := &slog.HandlerOptions{Level: lvl} + + var h slog.Handler + switch strings.ToLower(format) { + case "", "text": + h = slog.NewTextHandler(w, opts) + case "json": + h = slog.NewJSONHandler(w, opts) + default: + return nil, fmt.Errorf("unknown log format %q (want text|json)", format) + } + return slog.New(h), nil +} + +func parseLevel(s string) (slog.Level, error) { + switch strings.ToLower(strings.TrimSpace(s)) { + case "", "info": + return slog.LevelInfo, nil + case "debug": + return slog.LevelDebug, nil + case "warn", "warning": + return slog.LevelWarn, nil + case "error": + return slog.LevelError, nil + default: + return 0, fmt.Errorf("unknown log level %q", s) + } +}