This repository has been archived by the owner on May 13, 2022. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 346
/
stream_logger.go
70 lines (64 loc) · 1.75 KB
/
stream_logger.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
package loggers
import (
"fmt"
"io"
"text/template"
"github.com/go-kit/kit/log"
"github.com/go-kit/kit/log/term"
"github.com/hyperledger/burrow/logging/structure"
)
type Syncable interface {
Sync() error
}
func NewStreamLogger(writer io.Writer, format string) (log.Logger, error) {
var logger log.Logger
var err error
switch format {
case "":
return NewStreamLogger(writer, DefaultFormat)
case JSONFormat:
logger = log.NewJSONLogger(writer)
case LogfmtFormat:
logger = log.NewLogfmtLogger(writer)
case TerminalFormat:
logger = term.NewLogger(writer, log.NewLogfmtLogger, func(keyvals ...interface{}) term.FgBgColor {
switch structure.Value(keyvals, structure.ChannelKey) {
case structure.TraceChannelName:
return term.FgBgColor{Fg: term.DarkGreen}
default:
return term.FgBgColor{Fg: term.Yellow}
}
})
default:
logger, err = NewTemplateLogger(writer, format, []byte{})
if err != nil {
return nil, fmt.Errorf("did not recognise format '%s' as named format and could not parse as "+
"template: %v", format, err)
}
}
return log.LoggerFunc(func(keyvals ...interface{}) error {
switch structure.Signal(keyvals) {
case structure.SyncSignal:
if s, ok := writer.(Syncable); ok {
return s.Sync()
}
// Don't log signals
return nil
default:
return logger.Log(keyvals...)
}
}), nil
}
func NewTemplateLogger(writer io.Writer, textTemplate string, recordSeparator []byte) (log.Logger, error) {
tmpl, err := template.New("template-logger").Parse(textTemplate)
if err != nil {
return nil, err
}
return log.LoggerFunc(func(keyvals ...interface{}) error {
err := tmpl.Execute(writer, structure.KeyValuesMap(keyvals))
if err == nil {
_, err = writer.Write(recordSeparator)
}
return err
}), nil
}