63 lines
1.3 KiB
Go
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...)
|
|
}
|