// Copyright 2022 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package slog_test import ( "context" "fmt" "os" "path/filepath" "runtime" "time" "golang.org/x/exp/slog" ) // 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) { 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) } 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 { a.Key = "" } // Remove the directory from the source's filename. if a.Key == slog.SourceKey { a.Value = slog.StringValue(filepath.Base(a.Value.String())) } return a } logger := slog.New(slog.HandlerOptions{AddSource: true, ReplaceAttr: replace}.NewTextHandler(os.Stdout)) slog.SetDefault(logger) Infof("message, %s", "formatted") // Output: // level=INFO source=example_depth_test.go:47 msg="message, formatted" }