// ...
logger := slog.New(slog.HandlerOptions{ReplaceAttr: slogtest.RemoveTime}.NewTextHandler(os.Stdout))
- slog.SetDefault(logger)
-
- slog.Info("finished",
+ logger.Info("finished",
slog.Group("req",
slog.String("method", r.Method),
slog.String("url", r.URL.String())),
// Infof is an example of a user-defined logging function that wraps slog.
// The log record contains the source position of the caller of Infof.
-func Infof(format string, args ...any) {
- l := slog.Default()
- if !l.Enabled(context.Background(), slog.LevelInfo) {
+func Infof(logger *slog.Logger, format string, args ...any) {
+ if !logger.Enabled(context.Background(), slog.LevelInfo) {
return
}
var pcs [1]uintptr
runtime.Callers(2, pcs[:]) // skip [Callers, Infof]
r := slog.NewRecord(time.Now(), slog.LevelInfo, fmt.Sprintf(format, args...), pcs[0])
- _ = l.Handler().Handle(context.Background(), r)
+ _ = logger.Handler().Handle(context.Background(), r)
}
func Example_wrapping() {
- defer func(l *slog.Logger) { slog.SetDefault(l) }(slog.Default())
-
replace := func(groups []string, a slog.Attr) slog.Attr {
// Remove time.
if a.Key == slog.TimeKey && len(groups) == 0 {
return a
}
logger := slog.New(slog.HandlerOptions{AddSource: true, ReplaceAttr: replace}.NewTextHandler(os.Stdout))
- slog.SetDefault(logger)
- Infof("message, %s", "formatted")
+ Infof(logger, "message, %s", "formatted")
// Output:
- // level=INFO source=example_wrap_test.go:46 msg="message, formatted"
+ // level=INFO source=example_wrap_test.go:42 msg="message, formatted"
}