github.com/mongodb/grip@v0.0.0-20240213223901-f906268d82b9/slogger/appender.go (about) 1 package slogger 2 3 import ( 4 "bytes" 5 "os" 6 "strings" 7 8 "github.com/mongodb/grip/level" 9 "github.com/mongodb/grip/send" 10 ) 11 12 // Appender is the slogger equivalent of a send.Sender, and this 13 // provides the same public interface for Appenders, in terms of Grip's 14 // senders. 15 type Appender interface { 16 Append(log *Log) error 17 } 18 19 // StdOutAppender returns a configured stream logger Sender instance 20 // that writes messages to standard output. 21 func StdOutAppender() send.Sender { 22 s, _ := send.NewStreamLogger("", os.Stdout, send.LevelInfo{Default: level.Debug, Threshold: level.Debug}) 23 return s 24 } 25 26 // StdErrAppender returns a configured stream logger Sender instance 27 // that writes messages to standard error. 28 func StdErrAppender() send.Sender { 29 s, _ := send.NewStreamLogger("", os.Stderr, send.LevelInfo{Default: level.Debug, Threshold: level.Debug}) 30 return s 31 } 32 33 // DevNullAppender returns a configured stream logger Sender instance 34 // that writes messages to dev null. 35 func DevNullAppender() (send.Sender, error) { 36 devNull, err := os.OpenFile(os.DevNull, os.O_WRONLY, 0644) 37 if err != nil { 38 return nil, err 39 } 40 41 return send.NewStreamLogger("", devNull, send.LevelInfo{Default: level.Debug, Threshold: level.Debug}) 42 } 43 44 type stringAppender struct { 45 buf *bytes.Buffer 46 } 47 48 func (s stringAppender) WriteString(str string) (int, error) { 49 if !strings.HasSuffix(str, "\n") { 50 str += "\n" 51 } 52 return s.buf.WriteString(str) 53 } 54 55 // NewStringAppender wraps a bytes.Buffer and provides an 56 // send.Sender/Appender interface that writes log messages to that 57 // buffer. 58 func NewStringAppender(buffer *bytes.Buffer) send.Sender { 59 s, _ := send.NewStreamLogger("", stringAppender{buffer}, send.LevelInfo{Default: level.Debug, Threshold: level.Debug}) 60 return s 61 } 62 63 // LevelFilter provides compatibility with a legacy slogger 64 // implementation that filgered messages lower than the specified 65 // priority. This implementation simply sets the threshold level on 66 // that sender and returns it. 67 func LevelFilter(threshold Level, sender send.Sender) send.Sender { 68 l := sender.Level() 69 l.Threshold = threshold.Priority() 70 _ = sender.SetLevel(l) 71 72 return sender 73 } 74 75 // SenderAppender is a shim that implements the Appender interface 76 // around any arbitrary sender instance. 77 type SenderAppender struct { 78 send.Sender 79 } 80 81 // Append sends a log message. This method *always* returns nil. 82 func (s SenderAppender) Append(log *Log) error { 83 s.Send(log.msg) 84 85 return nil 86 }