Files
expds/data/app_log_handler.go
2026-02-04 17:01:54 -06:00

51 lines
1.4 KiB
Go

package data
import (
"context"
"errors"
"log/slog"
"time"
)
type AppLogHandler struct {
level slog.Level
logFunc func(string, ...any)
attrs []slog.Attr
groups []string
}
func NewAppLogHandler(f func(string, ...any)) *AppLogHandler {
return &AppLogHandler{logFunc: f}
}
func (a *AppLogHandler) SetLevel(l slog.Level) { a.level = l }
func (a *AppLogHandler) setAttrs(attrs ...slog.Attr) { a.attrs = attrs }
func (a *AppLogHandler) addAttrs(attrs ...slog.Attr) { a.attrs = append(a.attrs, attrs...) }
func (a *AppLogHandler) setGroups(groups ...string) { a.groups = groups }
func (a *AppLogHandler) addGroups(groups ...string) { a.groups = append(a.groups, groups...) }
// AppLogHandler can handle all levels
func (a *AppLogHandler) Enabled(_ context.Context, lvl slog.Level) bool { return lvl >= a.level }
func (a *AppLogHandler) Handle(ctx context.Context, rcd slog.Record) error {
if a.logFunc == nil {
return errors.New("no log func defined")
}
a.logFunc("%s %s %s", rcd.Time.Format(time.TimeOnly), rcd.Level, rcd.Message)
return nil
}
func (a *AppLogHandler) WithAttrs(attrs []slog.Attr) slog.Handler {
attrs = append(attrs, a.attrs...)
ret := NewAppLogHandler(a.logFunc)
ret.addAttrs(attrs...)
return ret
}
func (a *AppLogHandler) WithGroup(name string) slog.Handler {
groups := append(a.groups, name)
ret := NewAppLogHandler(a.logFunc)
ret.setGroups(groups...)
return ret
}