aboutsummaryrefslogtreecommitdiffstats
path: root/logging/sink.go
diff options
context:
space:
mode:
Diffstat (limited to 'logging/sink.go')
-rw-r--r--logging/sink.go48
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)
+}