Files
vRp.CD2g_test/utils/log/multi_handler.go
2024-01-05 00:18:32 +08:00

63 lines
1.3 KiB
Go

package log
import (
"context"
"github.com/kercylan98/minotaur/utils/super"
"log/slog"
)
// NewMultiHandler 创建一个新的多处理程序
func NewMultiHandler(handlers ...slog.Handler) slog.Handler {
return &MultiHandler{
handlers: handlers,
}
}
type MultiHandler struct {
handlers []slog.Handler
}
func (h MultiHandler) Enabled(ctx context.Context, level slog.Level) bool {
for i := range h.handlers {
if h.handlers[i].Enabled(ctx, level) {
return true
}
}
return false
}
func (h MultiHandler) Handle(ctx context.Context, record slog.Record) (err error) {
for i := range h.handlers {
if h.handlers[i].Enabled(ctx, record.Level) {
err = func() error {
defer func() {
err = super.RecoverTransform(recover())
}()
return h.handlers[i].Handle(ctx, record.Clone())
}()
if err != nil {
return err
}
}
}
return nil
}
func (h MultiHandler) WithAttrs(attrs []slog.Attr) slog.Handler {
var handlers = make([]slog.Handler, len(h.handlers))
for i, s := range h.handlers {
handlers[i] = s.WithAttrs(attrs)
}
return NewMultiHandler(handlers...)
}
func (h MultiHandler) WithGroup(name string) slog.Handler {
var handlers = make([]slog.Handler, len(h.handlers))
for i, s := range h.handlers {
handlers[i] = s.WithGroup(name)
}
return NewMultiHandler(handlers...)
}