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  }