Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

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 levelclog level
< LevelDebugTraceLevel
LevelDebugDebugLevel
LevelInfoInfoLevel
LevelWarnWarnLevel
LevelErrorErrorLevel
> LevelErrorFatalLevel

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