logger_no121.go

 1//go:build !go1.21
 2// +build !go1.21
 3
 4package log
 5
 6import (
 7	"context"
 8	"runtime"
 9	"sync/atomic"
10
11	"golang.org/x/exp/slog"
12)
13
14// type alises for slog.
15type (
16	slogAttr      = slog.Attr
17	slogValue     = slog.Value
18	slogLogValuer = slog.LogValuer
19)
20
21const slogKindGroup = slog.KindGroup
22
23// Enabled reports whether the logger is enabled for the given level.
24//
25// Implements slog.Handler.
26func (l *Logger) Enabled(_ context.Context, level slog.Level) bool {
27	return atomic.LoadInt64(&l.level) <= int64(level)
28}
29
30// Handle handles the Record. It will only be called if Enabled returns true.
31//
32// Implements slog.Handler.
33func (l *Logger) Handle(_ context.Context, record slog.Record) error {
34	fields := make([]interface{}, 0, record.NumAttrs()*2)
35	record.Attrs(func(a slog.Attr) bool {
36		fields = append(fields, a.Key, a.Value)
37		return true
38	})
39	// Get the caller frame using the record's PC.
40	frames := runtime.CallersFrames([]uintptr{record.PC})
41	frame, _ := frames.Next()
42	l.handle(Level(record.Level), l.timeFunc(record.Time), []runtime.Frame{frame}, record.Message, fields...)
43	return nil
44}
45
46// WithAttrs returns a new Handler with the given attributes added.
47//
48// Implements slog.Handler.
49func (l *Logger) WithAttrs(attrs []slog.Attr) slog.Handler {
50	fields := make([]interface{}, 0, len(attrs)*2)
51	for _, attr := range attrs {
52		fields = append(fields, attr.Key, attr.Value)
53	}
54	return l.With(fields...)
55}
56
57// WithGroup returns a new Handler with the given group name prepended to the
58// current group name or prefix.
59//
60// Implements slog.Handler.
61func (l *Logger) WithGroup(name string) slog.Handler {
62	if l.prefix != "" {
63		name = l.prefix + "." + name
64	}
65	return l.WithPrefix(name)
66}
67
68var _ slog.Handler = (*Logger)(nil)