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  }