/
log.go
95 lines (81 loc) · 2.31 KB
/
log.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
package logmetry
import (
"os"
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
"golang.org/x/xerrors"
)
var (
// Logger is the global variable for logging
Logger *zap.SugaredLogger
debugOption bool
)
func init() {
// Set the default logger
Logger, _ = NewLogger(false, false) // nolint: errcheck
}
// InitLogger initialize the logger variable
func InitLogger(debug, disable bool) (err error) {
debugOption = debug
Logger, err = NewLogger(debug, disable)
if err != nil {
return xerrors.Errorf("failed to initialize a logger: %w", err)
}
return nil
}
// NewLogger is the factory method to return the instance of logger
func NewLogger(debug, disable bool) (*zap.SugaredLogger, error) {
// First, define our level-handling logic.
errorPriority := zap.LevelEnablerFunc(func(lvl zapcore.Level) bool {
return lvl >= zapcore.ErrorLevel
})
logPriority := zap.LevelEnablerFunc(func(lvl zapcore.Level) bool {
if debug {
return lvl < zapcore.ErrorLevel
}
// Not enable debug level
return zapcore.DebugLevel < lvl && lvl < zapcore.ErrorLevel
})
encoderConfig := zapcore.EncoderConfig{
TimeKey: "Time",
LevelKey: "Level",
NameKey: "Name",
CallerKey: "Caller",
MessageKey: "Msg",
StacktraceKey: "St",
EncodeLevel: zapcore.CapitalColorLevelEncoder,
EncodeTime: zapcore.ISO8601TimeEncoder,
EncodeDuration: zapcore.StringDurationEncoder,
EncodeCaller: zapcore.ShortCallerEncoder,
}
consoleEncoder := zapcore.NewConsoleEncoder(encoderConfig)
// High-priority output should also go to standard error, and low-priority
// output should also go to standard out.
consoleLogs := zapcore.Lock(os.Stdout)
consoleErrors := zapcore.Lock(os.Stderr)
if disable {
devNull, err := os.Create(os.DevNull)
if err != nil {
return nil, err
}
// Discard low-priority output
consoleLogs = zapcore.Lock(devNull)
}
core := zapcore.NewTee(
zapcore.NewCore(consoleEncoder, consoleErrors, errorPriority),
zapcore.NewCore(consoleEncoder, consoleLogs, logPriority),
)
opts := []zap.Option{zap.ErrorOutput(zapcore.Lock(os.Stderr))}
if debug {
opts = append(opts, zap.Development())
}
logger := zap.New(core, opts...)
return logger.Sugar(), nil
}
// Fatal for logging fatal errors
func Fatal(err error) {
if debugOption {
Logger.Fatalf("%+v", err)
}
Logger.Fatal(err)
}