github.com/skippbox/kompose-origin@v0.0.0-20160524133224-16a9dca7bac2/cli/logger/color_logger.go (about) 1 package logger 2 3 import ( 4 "fmt" 5 "os" 6 "strconv" 7 8 "github.com/docker/libcompose/logger" 9 "golang.org/x/crypto/ssh/terminal" 10 ) 11 12 // ColorLoggerFactory implements logger.Factory interface using ColorLogger. 13 type ColorLoggerFactory struct { 14 maxLength int 15 tty bool 16 } 17 18 // ColorLogger implements logger.Logger interface with color support. 19 type ColorLogger struct { 20 name string 21 colorPrefix string 22 factory *ColorLoggerFactory 23 } 24 25 // NewColorLoggerFactory creates a new ColorLoggerFactory. 26 func NewColorLoggerFactory() *ColorLoggerFactory { 27 return &ColorLoggerFactory{ 28 tty: terminal.IsTerminal(int(os.Stdout.Fd())), 29 } 30 } 31 32 // Create implements logger.Factory.Create. 33 func (c *ColorLoggerFactory) Create(name string) logger.Logger { 34 if c.maxLength < len(name) { 35 c.maxLength = len(name) 36 } 37 38 return &ColorLogger{ 39 name: name, 40 factory: c, 41 colorPrefix: <-colorPrefix, 42 } 43 } 44 45 // Out implements logger.Logger.Out. 46 func (c *ColorLogger) Out(bytes []byte) { 47 if len(bytes) == 0 { 48 return 49 } 50 logFmt, name := c.getLogFmt() 51 message := fmt.Sprintf(logFmt, name, string(bytes)) 52 fmt.Print(message) 53 } 54 55 // Err implements logger.Logger.Err. 56 func (c *ColorLogger) Err(bytes []byte) { 57 if len(bytes) == 0 { 58 return 59 } 60 logFmt, name := c.getLogFmt() 61 message := fmt.Sprintf(logFmt, name, string(bytes)) 62 fmt.Fprint(os.Stderr, message) 63 } 64 65 func (c *ColorLogger) getLogFmt() (string, string) { 66 pad := c.factory.maxLength 67 68 logFmt := "%s | %s" 69 if c.factory.tty { 70 logFmt = c.colorPrefix + " %s" 71 } 72 73 name := fmt.Sprintf("%-"+strconv.Itoa(pad)+"s", c.name) 74 75 return logFmt, name 76 }