diff options
Diffstat (limited to 'logging/writer.go')
| -rw-r--r-- | logging/writer.go | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/logging/writer.go b/logging/writer.go new file mode 100644 index 0000000..6f1ee34 --- /dev/null +++ b/logging/writer.go @@ -0,0 +1,45 @@ +package logging + +import ( + "fmt" + "io" + "log/slog" + "sync" +) + +type WriterSink struct { + Writer io.Writer + mu sync.Mutex + Encoder Encoder + Level slog.Level + ReplaceAttr func(groups []string, a slog.Attr) slog.Attr +} + +var _ Sink = &WriterSink{} + +func NewWriterSink(w io.Writer, encoder Encoder, level slog.Leveler, replaceAttr func(groups []string, a slog.Attr) slog.Attr) *WriterSink { + return &WriterSink{ + Writer: w, + Encoder: encoder, + Level: level.Level(), + ReplaceAttr: replaceAttr, + } +} + +func (s *WriterSink) Enabled(level slog.Level) bool { + return s.Level <= level +} + +func (s *WriterSink) Append(r slog.Record) error { + it := RecordAll(r, s.ReplaceAttr) + out, err := s.Encoder(it) + if err != nil { + return fmt.Errorf("failed to encode: %w", err) + } + + s.mu.Lock() + defer s.mu.Unlock() + + _, err = fmt.Fprintln(s.Writer, out) + return err +} |
