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 }