github.com/tilt-dev/tilt@v0.33.15-0.20240515162809-0a22ed45d8a0/pkg/logger/prefixed_logger.go (about) 1 package logger 2 3 import ( 4 "strings" 5 ) 6 7 // sticks "prefix" at the start of every new line 8 type prefixedLogger struct { 9 Logger 10 11 original Logger 12 prefix string 13 indentBeforeNextWrite bool 14 } 15 16 var _ Logger = &prefixedLogger{} 17 18 func NewPrefixedLogger(prefix string, original Logger) *prefixedLogger { 19 result := &prefixedLogger{original: original, prefix: prefix, indentBeforeNextWrite: true} 20 21 delegate := NewFuncLogger(original.SupportsColor(), original.Level(), result.handleLog) 22 result.Logger = delegate 23 24 return result 25 } 26 27 func (i *prefixedLogger) handleLog(level Level, fields Fields, buf []byte) error { 28 output := "" 29 30 if i.indentBeforeNextWrite { 31 output += i.prefix 32 } 33 34 output += string(buf) 35 36 // temporarily take off a trailing newline so that Replace doesn't add a prefix at the end 37 endsInNewline := false 38 if len(output) > 0 { 39 endsInNewline = output[len(output)-1] == '\n' 40 } 41 42 if endsInNewline { 43 output = output[:len(output)-1] 44 } 45 46 output = strings.ReplaceAll(output, "\n", "\n"+i.prefix) 47 48 if endsInNewline { 49 output += "\n" 50 i.indentBeforeNextWrite = true 51 } else { 52 i.indentBeforeNextWrite = false 53 } 54 55 i.original.WithFields(fields).Write(level, []byte(output)) 56 return nil 57 }