package logs
import (
)
type HandlerFunc func(context.Context, slog.Record) error
func ( HandlerFunc) ( context.Context, slog.Level) bool {
return true
}
func ( HandlerFunc) ( context.Context, slog.Record) error {
return (, )
}
func ( HandlerFunc) ( []slog.Attr) slog.Handler {
return HandlerFunc(func( context.Context, slog.Record) error {
return (, slogRecordAddAttrs(
slog.NewRecord(.Time, .Level, .Message, .PC),
slices.AppendSeq(slices.Clip(), .Attrs)...,
))
})
}
func ( HandlerFunc) ( string) slog.Handler {
return HandlerFunc(func( context.Context, slog.Record) error {
return (, slogRecordAddAttrs(
slog.NewRecord(.Time, .Level, .Message, .PC),
slog.GroupAttrs(, slices.Collect(.Attrs)...),
))
})
}
func ( slog.Record, ...slog.Attr) slog.Record {
.AddAttrs(...)
return
}
type Hooks struct {
Enabled func(ctx context.Context, l slog.Level, next slog.Handler) bool
Handle func(ctx context.Context, r slog.Record, next slog.Handler) error
}
type WrapHandler struct {
next slog.Handler
hooks Hooks
}
func ( slog.Handler, Hooks) *WrapHandler {
return &WrapHandler{
next: ,
hooks: ,
}
}
func ( *WrapHandler) ( context.Context, slog.Level) bool {
if .hooks.Enabled == nil {
return .next.Enabled(, )
}
return .hooks.Enabled(, , .next)
}
func ( *WrapHandler) ( context.Context, slog.Record) error {
if .hooks.Handle == nil {
return .next.Handle(, )
}
return .hooks.Handle(, , .next)
}
func ( *WrapHandler) ( []slog.Attr) slog.Handler {
:= *
.next = .next.WithAttrs()
return &
}
func ( *WrapHandler) ( string) slog.Handler {
:= *
.next = .next.WithGroup()
return &
}
type ExpiredContextFilter struct {
dropped atomic.Uint64
}
func ( *ExpiredContextFilter) () Hooks {
return Hooks{
Enabled: .Enabled,
Handle: .Handle,
}
}
func ( *ExpiredContextFilter) ( context.Context, slog.Level, slog.Handler) bool {
return .Enabled(, ) && !.expired()
}
func ( *ExpiredContextFilter) ( context.Context, slog.Record, slog.Handler) error {
if .expired() {
return nil
}
return .Handle(, )
}
func ( *ExpiredContextFilter) () uint64 {
return .dropped.Load()
}
func ( *ExpiredContextFilter) ( context.Context) bool {
select {
case <-.Done():
.dropped.Add(1)
return true
default:
return false
}
}
type LevelLimitFilter struct {
Level slog.Leveler
}
func ( slog.Handler, slog.Leveler) slog.Handler {
return Wrap(, (&LevelLimitFilter{}).Hooks())
}
func ( *LevelLimitFilter) () Hooks {
return Hooks{
Enabled: .Enabled,
Handle: .Handle,
}
}
func ( *LevelLimitFilter) ( context.Context, slog.Level, slog.Handler) bool {
return .enabled() && .Enabled(, )
}
func ( *LevelLimitFilter) ( context.Context, slog.Record, slog.Handler) error {
if !.enabled(.Level) {
return nil
}
return .Handle(, )
}
func ( *LevelLimitFilter) ( slog.Level) bool {
return .Level == nil || >= .Level.Level()
}