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 }