51 lines
1.4 KiB
Go
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
|
|
}
|