feat(skel): slog logger factory with text|json format and level parsing
This commit is contained in:
@@ -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)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user