github.com/mongodb/grip@v0.0.0-20240213223901-f906268d82b9/send/stream.go (about) 1 package send 2 3 import ( 4 "context" 5 "fmt" 6 "log" 7 "os" 8 "strings" 9 10 "github.com/mongodb/grip/message" 11 ) 12 13 // this file contains tools to support the slogger interface 14 15 // WriteStringer captures the relevant part of the io.Writer interface 16 // useful for writing log messages to streams. 17 type WriteStringer interface { 18 WriteString(str string) (int, error) 19 } 20 21 type streamLogger struct { 22 fobj WriteStringer 23 *Base 24 } 25 26 // NewStreamLogger produces a fully configured Sender that writes 27 // un-formatted log messages to an io.Writer (or conforming subset). 28 func NewStreamLogger(name string, ws WriteStringer, l LevelInfo) (Sender, error) { 29 return setup(MakeStreamLogger(ws), name, l) 30 } 31 32 // MakeStreamLogger constructs an unconfigured stream sender that 33 // writes un-formatted log messages to the specified io.Writer, or 34 // instance that implements a conforming subset. 35 func MakeStreamLogger(ws WriteStringer) Sender { 36 s := &streamLogger{ 37 fobj: ws, 38 Base: NewBase(""), 39 } 40 41 fallback := log.New(os.Stdout, "", log.LstdFlags) 42 _ = s.SetErrorHandler(ErrorHandlerFromLogger(fallback)) 43 44 s.reset = func() { 45 fallback.SetPrefix(fmt.Sprintf("[%s] ", s.Name())) 46 } 47 48 return s 49 } 50 51 func (s *streamLogger) Send(m message.Composer) { 52 if s.Level().ShouldLog(m) { 53 msg := m.String() 54 55 if !strings.HasSuffix(msg, "\n") { 56 msg += "\n" 57 } 58 59 if _, err := s.fobj.WriteString(msg); err != nil { 60 s.ErrorHandler()(err, m) 61 } 62 } 63 } 64 65 func (s *streamLogger) Flush(_ context.Context) error { return nil }