This repository has been archived by the owner on Sep 9, 2020. It is now read-only.
/
logger.go
106 lines (87 loc) · 2.51 KB
/
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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
package logger
import (
"fmt"
"io"
"io/ioutil"
stdlog "log"
"os"
"time"
logCfg "github.com/jrasell/chemtrail/pkg/config/log"
"github.com/mattn/go-isatty"
"github.com/pkg/errors"
"github.com/rs/zerolog"
"github.com/rs/zerolog/log"
)
const (
// Use a log format that resembles time.RFC3339Nano but includes all trailing
// zeros so that we get fixed-width logging.
logTimeFormat = "2006-01-02T15:04:05.000000000Z07:00"
)
var stdLogger *stdlog.Logger
func init() {
// Initialize zerolog with a set set of defaults. Re-initialization of
// logging with user-supplied configuration parameters happens in Setup().
// os.Stderr isn't guaranteed to be thread-safe, wrap in a sync writer. Files
// are guaranteed to be safe, terminals are not.
w := zerolog.ConsoleWriter{
Out: os.Stderr,
NoColor: true,
}
zlog := zerolog.New(zerolog.SyncWriter(w)).With().Timestamp().Logger()
zerolog.DurationFieldUnit = time.Microsecond
zerolog.DurationFieldInteger = true
zerolog.TimeFieldFormat = logTimeFormat
zerolog.SetGlobalLevel(zerolog.InfoLevel)
log.Logger = zlog
stdlog.SetFlags(0)
stdlog.SetOutput(zlog)
}
// Setup configures the chemtrail logging based on user configuration.
func Setup(config logCfg.Config) error {
logLevel, err := setLogLevel(config.LogLevel)
if err != nil {
return errors.Wrap(err, "unable to set log level")
}
var logWriter io.Writer = os.Stderr
logFmt, err := getLogFormat(config.LogFormat)
if err != nil {
return errors.Wrap(err, "unable to parse log format")
}
if logFmt == FormatAuto {
if isatty.IsTerminal(os.Stdout.Fd()) || isatty.IsCygwinTerminal(os.Stdout.Fd()) {
logFmt = FormatHuman
} else {
logFmt = FormatZerolog
}
}
var zlog zerolog.Logger
switch logFmt {
case FormatZerolog:
zlog = zerolog.New(logWriter).With().Timestamp().Logger()
case FormatHuman:
useColor := config.UseColor
w := zerolog.ConsoleWriter{
Out: logWriter,
NoColor: !useColor,
}
zlog = zerolog.New(w).With().Timestamp().Logger()
default:
return fmt.Errorf("unsupported log format: %q", logFmt)
}
log.Logger = zlog
stdlog.SetFlags(0)
stdlog.SetOutput(zlog)
stdLogger = &stdlog.Logger{}
// In order to prevent random libraries from hooking the standard logger and
// filling the logger with garbage, discard all log entries. At debug level,
// however, let it all through.
if logLevel != LevelDebug {
stdLogger.SetOutput(ioutil.Discard)
} else {
stdLogger.SetOutput(zlog)
}
if config.EnableDev {
log.Logger = log.With().Caller().Logger()
}
return nil
}