github.com/ahmet2mir/goreleaser@v0.180.3-0.20210927151101-8e5ee5a9b8c5/internal/logext/writer.go (about)

     1  package logext
     2  
     3  import (
     4  	"bytes"
     5  	"io"
     6  	"strings"
     7  
     8  	"github.com/apex/log"
     9  	"github.com/apex/log/handlers/cli"
    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  	if isDebug() {
    26  		return logWriter{
    27  			ctx: newLogger(fields),
    28  			out: out,
    29  		}
    30  	}
    31  	return io.Discard
    32  }
    33  
    34  type logWriter struct {
    35  	ctx *log.Entry
    36  	out Output
    37  }
    38  
    39  func (w logWriter) Write(p []byte) (int, error) {
    40  	for _, line := range strings.Split(toString(p), "\n") {
    41  		switch w.out {
    42  		case Info:
    43  			w.ctx.Info(line)
    44  		case Error:
    45  			w.ctx.Error(line)
    46  		}
    47  	}
    48  	return len(p), nil
    49  }
    50  
    51  func newLogger(fields log.Fields) *log.Entry {
    52  	handler := cli.New(cli.Default.Writer)
    53  	handler.Padding = cli.Default.Padding + 3
    54  	logger := log.WithFields(fields)
    55  	logger.Logger.Handler = handler
    56  	return logger
    57  }
    58  
    59  func isDebug() bool {
    60  	return logLevel() == log.DebugLevel
    61  }
    62  
    63  func logLevel() log.Level {
    64  	if logger, ok := log.Log.(*log.Logger); ok {
    65  		return logger.Level
    66  	}
    67  	return log.InfoLevel
    68  }
    69  
    70  func toString(b []byte) string {
    71  	return string(bytes.TrimSuffix(b, []byte("\n")))
    72  }