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 }