github.com/hyperledger/burrow@v0.34.5-0.20220512172541-77f09336001d/logging/loggers/stream_logger.go (about)

     1  package loggers
     2  
     3  import (
     4  	"fmt"
     5  	"io"
     6  	"text/template"
     7  
     8  	"github.com/go-kit/kit/log"
     9  	"github.com/go-kit/kit/log/term"
    10  	"github.com/hyperledger/burrow/logging/structure"
    11  )
    12  
    13  type Syncable interface {
    14  	Sync() error
    15  }
    16  
    17  func NewStreamLogger(writer io.Writer, format string) (log.Logger, error) {
    18  	switch format {
    19  	case "":
    20  		return NewStreamLogger(writer, DefaultFormat)
    21  	case JSONFormat:
    22  		return NewJSONLogger(writer), nil
    23  	case LogfmtFormat:
    24  		return NewLogfmtLogger(writer), nil
    25  	case TerminalFormat:
    26  		return NewTerminalLogger(writer), nil
    27  	default:
    28  		return NewTemplateLogger(writer, format, []byte{})
    29  	}
    30  }
    31  
    32  func NewJSONLogger(writer io.Writer) log.Logger {
    33  	return interceptSync(writer, log.NewJSONLogger(writer))
    34  }
    35  
    36  func NewLogfmtLogger(writer io.Writer) log.Logger {
    37  	return interceptSync(writer, log.NewLogfmtLogger(writer))
    38  }
    39  
    40  func NewTerminalLogger(writer io.Writer) log.Logger {
    41  	logger := term.NewLogger(writer, log.NewLogfmtLogger, func(keyvals ...interface{}) term.FgBgColor {
    42  		switch structure.Value(keyvals, structure.ChannelKey) {
    43  		case structure.TraceChannelName:
    44  			return term.FgBgColor{Fg: term.DarkGreen}
    45  		default:
    46  			return term.FgBgColor{Fg: term.Yellow}
    47  		}
    48  	})
    49  	return interceptSync(writer, NewBurrowFormatLogger(logger, StringifyValues))
    50  }
    51  
    52  func NewTemplateLogger(writer io.Writer, textTemplate string, recordSeparator []byte) (log.Logger, error) {
    53  	tmpl, err := template.New("template-logger").Parse(textTemplate)
    54  	if err != nil {
    55  		return nil, fmt.Errorf("could not parse '%s' as a text template: %v", textTemplate, err)
    56  	}
    57  	logger := log.LoggerFunc(func(keyvals ...interface{}) error {
    58  		err := tmpl.Execute(writer, structure.KeyValuesMap(keyvals))
    59  		if err == nil {
    60  			_, err = writer.Write(recordSeparator)
    61  		}
    62  		return err
    63  	})
    64  	return interceptSync(writer, logger), nil
    65  }
    66  
    67  func interceptSync(writer io.Writer, logger log.Logger) log.Logger {
    68  	return log.LoggerFunc(func(keyvals ...interface{}) error {
    69  		switch structure.Signal(keyvals) {
    70  		case structure.SyncSignal:
    71  			if s, ok := writer.(Syncable); ok {
    72  				return s.Sync()
    73  			}
    74  			// Don't log signals
    75  			return nil
    76  		default:
    77  			return logger.Log(keyvals...)
    78  		}
    79  	})
    80  }