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 }