Files
databasus/backend/internal/util/logger/multi_handler.go
2026-03-13 18:50:57 +03:00

60 lines
1.3 KiB
Go

package logger
import (
"context"
"log/slog"
)
type MultiHandler struct {
stdoutHandler slog.Handler
victoriaLogsWriter *VictoriaLogsWriter
}
func NewMultiHandler(
stdoutHandler slog.Handler,
victoriaLogsWriter *VictoriaLogsWriter,
) *MultiHandler {
return &MultiHandler{
stdoutHandler: stdoutHandler,
victoriaLogsWriter: victoriaLogsWriter,
}
}
func (h *MultiHandler) Enabled(ctx context.Context, level slog.Level) bool {
return h.stdoutHandler.Enabled(ctx, level)
}
func (h *MultiHandler) Handle(ctx context.Context, record slog.Record) error {
// Send to stdout handler
if err := h.stdoutHandler.Handle(ctx, record); err != nil {
return err
}
// Send to VictoriaLogs if configured
if h.victoriaLogsWriter != nil {
attrs := make(map[string]any)
record.Attrs(func(a slog.Attr) bool {
attrs[a.Key] = a.Value.Any()
return true
})
h.victoriaLogsWriter.Write(record.Level.String(), record.Message, attrs)
}
return nil
}
func (h *MultiHandler) WithAttrs(attrs []slog.Attr) slog.Handler {
return &MultiHandler{
stdoutHandler: h.stdoutHandler.WithAttrs(attrs),
victoriaLogsWriter: h.victoriaLogsWriter,
}
}
func (h *MultiHandler) WithGroup(name string) slog.Handler {
return &MultiHandler{
stdoutHandler: h.stdoutHandler.WithGroup(name),
victoriaLogsWriter: h.victoriaLogsWriter,
}
}