github.com/benchkram/bob@v0.0.0-20240314204020-b7a57f2f9be9/pkg/composectl/logger.go (about) 1 package composectl 2 3 import ( 4 "fmt" 5 "io" 6 "sync" 7 8 "github.com/docker/compose/v2/pkg/api" 9 "github.com/logrusorgru/aurora" 10 ) 11 12 var colorPool = []aurora.Color{ 13 aurora.BlueFg, 14 aurora.GreenFg, 15 aurora.CyanFg, 16 aurora.MagentaFg, 17 aurora.YellowFg, 18 aurora.RedFg, 19 } 20 21 type logger struct { 22 writer io.Writer 23 mutex sync.Mutex 24 containerColors map[string]aurora.Color 25 } 26 27 var _ api.LogConsumer = (*logger)(nil) 28 29 func NewLogConsumer(w io.Writer) (*logger, error) { 30 return &logger{ 31 writer: w, 32 containerColors: map[string]aurora.Color{}, 33 }, nil 34 } 35 36 func (l *logger) colorize(cid string) string { 37 color, ok := l.containerColors[cid] 38 if ok { 39 return aurora.Colorize(cid, color).String() 40 } 41 42 color = colorPool[len(l.containerColors)%len(colorPool)] 43 l.containerColors[cid] = color 44 45 return aurora.Colorize(cid, color).String() 46 } 47 48 func (l *logger) Log(_, container, msg string) { 49 l.mutex.Lock() 50 _, _ = l.writer.Write([]byte(fmt.Sprintf("[%s] %s\n", l.colorize(container), msg))) 51 l.mutex.Unlock() 52 } 53 54 func (l *logger) Status(container, msg string) { 55 l.mutex.Lock() 56 _, _ = l.writer.Write([]byte(fmt.Sprintf("[%s] %s\n", l.colorize(container), msg))) 57 l.mutex.Unlock() 58 } 59 60 func (l *logger) Register(container string) { 61 l.mutex.Lock() 62 _, _ = l.writer.Write([]byte(fmt.Sprintf("[%s] registered\n", l.colorize(container)))) 63 l.mutex.Unlock() 64 }