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 }