github.com/lixvbnet/courtney@v0.0.0-20221025031132-0dcb02231211/tester/logger/logger.go (about)

     1  package logger
     2  
     3  import (
     4  	"bytes"
     5  	"io"
     6  )
     7  
     8  // Log returns a buffer and two Writers. Data written to the writers is
     9  // combined and stored in the buffer. If verbose = true, it is also written to
    10  // the two provided Writers.
    11  func Log(verbose bool, stdout io.Writer, stderr io.Writer) (log *bytes.Buffer, loggedStdout io.Writer, loggedStderr io.Writer) {
    12  	log = &bytes.Buffer{}
    13  	if verbose {
    14  		loggedStdout = MultiWriter(stdout, log)
    15  		loggedStderr = MultiWriter(stderr, log)
    16  	} else {
    17  		loggedStdout = log
    18  		loggedStderr = log
    19  	}
    20  	return
    21  }
    22  
    23  // MultiWriter creates a writer that duplicates its writes to all the
    24  // provided writers, similar to the Unix tee(1) command.
    25  func MultiWriter(primary io.Writer, writers ...io.Writer) io.Writer {
    26  	w := make([]io.Writer, len(writers))
    27  	copy(w, writers)
    28  	return &multiWriter{primary: primary, writers: w}
    29  }
    30  
    31  type multiWriter struct {
    32  	primary io.Writer
    33  	writers []io.Writer
    34  }
    35  
    36  // Write writes to the writers.
    37  func (t *multiWriter) Write(p []byte) (n int, err error) {
    38  	for _, w := range t.writers {
    39  		w.Write(p)
    40  	}
    41  	return t.primary.Write(p)
    42  }