github.com/triarius/goreleaser@v1.12.5/internal/logext/writer.go (about)

     1  package logext
     2  
     3  import (
     4  	"bytes"
     5  	"io"
     6  	"os"
     7  	"strings"
     8  
     9  	"github.com/caarlos0/log"
    10  )
    11  
    12  // Output type of the log output.
    13  type Output int
    14  
    15  const (
    16  	// Info usually is used with stdout.
    17  	Info Output = iota
    18  
    19  	// Error usually is used with stderr.
    20  	Error
    21  )
    22  
    23  // NewWriter creates a new log writer.
    24  func NewWriter(fields log.Fields, out Output) io.Writer {
    25  	return NewConditionalWriter(fields, out, false)
    26  }
    27  
    28  // NewConditionalWriter creates a new log writer that only writes when the given condition is met or debug is enabled.
    29  func NewConditionalWriter(fields log.Fields, out Output, condition bool) io.Writer {
    30  	if condition || isDebug() {
    31  		return logWriter{
    32  			ctx: newLogger(fields),
    33  			out: out,
    34  		}
    35  	}
    36  	return io.Discard
    37  }
    38  
    39  type logWriter struct {
    40  	ctx *log.Entry
    41  	out Output
    42  }
    43  
    44  func (w logWriter) Write(p []byte) (int, error) {
    45  	for _, line := range strings.Split(toString(p), "\n") {
    46  		switch w.out {
    47  		case Info:
    48  			w.ctx.Info(line)
    49  		case Error:
    50  			w.ctx.Warn(line)
    51  		}
    52  	}
    53  	return len(p), nil
    54  }
    55  
    56  func newLogger(fields log.Fields) *log.Entry {
    57  	handler := log.New(currentWriter())
    58  	handler.IncreasePadding()
    59  	return handler.WithFields(fields)
    60  }
    61  
    62  func currentWriter() io.Writer {
    63  	logger, ok := log.Log.(*log.Logger)
    64  	if !ok {
    65  		return os.Stderr
    66  	}
    67  	return logger.Writer
    68  }
    69  
    70  func isDebug() bool {
    71  	return logLevel() == log.DebugLevel
    72  }
    73  
    74  func logLevel() log.Level {
    75  	if logger, ok := log.Log.(*log.Logger); ok {
    76  		return logger.Level
    77  	}
    78  	return log.InfoLevel
    79  }
    80  
    81  func toString(b []byte) string {
    82  	return string(bytes.TrimSuffix(b, []byte("\n")))
    83  }