// Package log is a context wrapper around slog.Logger
package log import ( ) var _default = slog.New(NewPrettyHandler(NewLevelHandler(slog.LevelInfo, slog.NewTextHandler(os.Stderr, nil)))).With(slog.String("logger", "default")) func () { slog.SetDefault(_default) } type loggerKey struct{} func from( context.Context) *slog.Logger { , := .Value(loggerKey{}).(*slog.Logger) if ! { _default.WarnContext(, "missing slog.Logger in context, see lib/log.With", slog.String("stack", string(debug.Stack()))) return _default } return } func ( context.Context, *slog.Logger) context.Context { return context.WithValue(, loggerKey{}, ) } func ( context.Context) context.Context { return context.WithValue(, loggerKey{}, _default) } func ( context.Context, slog.Level) context.Context { := from() := .Handler() := NewLevelHandler(, ) := NewPrettyHandler() return With(, slog.New()) } func ( context.Context, testing.TB) context.Context { := &tbWriter{tb: } := slog.NewTextHandler(, nil) := slog.New() return With(, ) } func ( context.Context, string, ...slog.Attr) { from().LogAttrs(, slog.LevelDebug, , ...) } func ( context.Context, string, ...slog.Attr) { from().LogAttrs(, slog.LevelInfo, , ...) } func ( context.Context, string, ...slog.Attr) { from().LogAttrs(, slog.LevelWarn, , ...) } func ( context.Context, string, ...slog.Attr) { from().LogAttrs(, slog.LevelError, , ...) }