50 lines
1.0 KiB
Go
50 lines
1.0 KiB
Go
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)
|
|
}
|
|
}
|