forked from toolshed/abra
		
	
		
			
				
	
	
		
			71 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			71 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
//go:build !go1.21
 | 
						|
// +build !go1.21
 | 
						|
 | 
						|
package log
 | 
						|
 | 
						|
import (
 | 
						|
	"context"
 | 
						|
	"runtime"
 | 
						|
	"sync/atomic"
 | 
						|
 | 
						|
	"golang.org/x/exp/slog"
 | 
						|
)
 | 
						|
 | 
						|
// type alises for slog.
 | 
						|
type (
 | 
						|
	slogAttr      = slog.Attr
 | 
						|
	slogValue     = slog.Value
 | 
						|
	slogLogValuer = slog.LogValuer
 | 
						|
)
 | 
						|
 | 
						|
var slogAnyValue = slog.AnyValue
 | 
						|
 | 
						|
const slogKindGroup = slog.KindGroup
 | 
						|
 | 
						|
// Enabled reports whether the logger is enabled for the given level.
 | 
						|
//
 | 
						|
// Implements slog.Handler.
 | 
						|
func (l *Logger) Enabled(_ context.Context, level slog.Level) bool {
 | 
						|
	return atomic.LoadInt64(&l.level) <= int64(level)
 | 
						|
}
 | 
						|
 | 
						|
// Handle handles the Record. It will only be called if Enabled returns true.
 | 
						|
//
 | 
						|
// Implements slog.Handler.
 | 
						|
func (l *Logger) Handle(_ context.Context, record slog.Record) error {
 | 
						|
	fields := make([]interface{}, 0, record.NumAttrs()*2)
 | 
						|
	record.Attrs(func(a slog.Attr) bool {
 | 
						|
		fields = append(fields, a.Key, a.Value)
 | 
						|
		return true
 | 
						|
	})
 | 
						|
	// Get the caller frame using the record's PC.
 | 
						|
	frames := runtime.CallersFrames([]uintptr{record.PC})
 | 
						|
	frame, _ := frames.Next()
 | 
						|
	l.handle(Level(record.Level), l.timeFunc(record.Time), []runtime.Frame{frame}, record.Message, fields...)
 | 
						|
	return nil
 | 
						|
}
 | 
						|
 | 
						|
// WithAttrs returns a new Handler with the given attributes added.
 | 
						|
//
 | 
						|
// Implements slog.Handler.
 | 
						|
func (l *Logger) WithAttrs(attrs []slog.Attr) slog.Handler {
 | 
						|
	fields := make([]interface{}, 0, len(attrs)*2)
 | 
						|
	for _, attr := range attrs {
 | 
						|
		fields = append(fields, attr.Key, attr.Value)
 | 
						|
	}
 | 
						|
	return l.With(fields...)
 | 
						|
}
 | 
						|
 | 
						|
// WithGroup returns a new Handler with the given group name prepended to the
 | 
						|
// current group name or prefix.
 | 
						|
//
 | 
						|
// Implements slog.Handler.
 | 
						|
func (l *Logger) WithGroup(name string) slog.Handler {
 | 
						|
	if l.prefix != "" {
 | 
						|
		name = l.prefix + "." + name
 | 
						|
	}
 | 
						|
	return l.WithPrefix(name)
 | 
						|
}
 | 
						|
 | 
						|
var _ slog.Handler = (*Logger)(nil)
 |