diff options
Diffstat (limited to 'logging/sink.go')
| -rw-r--r-- | logging/sink.go | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/logging/sink.go b/logging/sink.go new file mode 100644 index 0000000..a1e6748 --- /dev/null +++ b/logging/sink.go @@ -0,0 +1,48 @@ +package logging + +import ( + "context" + "log/slog" +) + +type Sink interface { + Append(r slog.Record) error + Enabled(level slog.Level) bool +} + +type SinkHandler struct { + Sink Sink +} + +var _ slog.Handler = &SinkHandler{} + +func NewSinkHandler(sink Sink) *SinkHandler { + return &SinkHandler{ + Sink: sink, + } +} + +func (h *SinkHandler) Enabled(ctx context.Context, level slog.Level) bool { + if h.Sink == nil { + return false // disable if no sink + } + return h.Sink.Enabled(level) +} + +func (h *SinkHandler) Handle(ctx context.Context, r slog.Record) error { + newRecord := slog.NewRecord(r.Time, r.Level, r.Message, r.PC) + + attrs := GetNormalizedAttrs(r) + + newRecord.AddAttrs(attrs...) + return h.Sink.Append(newRecord) +} + +func (h *SinkHandler) WithAttrs(attrs []slog.Attr) slog.Handler { + return ChainAttrs(h, attrs) + +} + +func (h *SinkHandler) WithGroup(name string) slog.Handler { + return ChainGroup(h, name) +} |
