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 }