log/slog Integration
Use NewSlogHandler to create a slog.Handler backed by a clog logger. This lets any code that accepts slog.Handler or *slog.Logger produce clog-formatted output.
h := clog.NewSlogHandler(clog.Default, nil)
logger := slog.New(h)
logger.Info("request handled", "method", "GET", "status", 200)
// INF ℹ️ request handled method=GET status=200
Options
h := clog.NewSlogHandler(clog.Default, &clog.SlogOptions{
AddSource: true, // include source file:line in each entry
Level: slog.LevelWarn, // override minimum level (nil = use logger's level)
})
Level Mapping
| slog level | clog level |
|---|---|
< LevelDebug | TraceLevel |
LevelDebug | DebugLevel |
LevelInfo | InfoLevel |
LevelWarn | WarnLevel |
LevelError | ErrorLevel |
> LevelError | FatalLevel |
Records mapped to FatalLevel are logged but do not call os.Exit - only clog’s own Fatal().Msg() does that.
Groups and Attrs
WithGroup and WithAttrs work as expected. Groups use dot-notation keys matching clog’s Dict() pattern:
h := clog.NewSlogHandler(clog.Default, nil)
logger := slog.New(h).WithGroup("req")
logger.Info("handled", "method", "GET", "status", 200)
// INF ℹ️ handled req.method=GET req.status=200