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  }