-
Notifications
You must be signed in to change notification settings - Fork 18
/
log.go
105 lines (86 loc) · 2.48 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
96
97
98
99
100
101
102
103
104
105
package main
import (
"errors"
"math"
"strings"
"gopkg.in/natefinch/lumberjack.v2"
"github.com/rekby/lets-proxy2/internal/log"
"go.uber.org/zap/zapcore"
"go.uber.org/zap"
)
type logWriteSyncer struct {
*lumberjack.Logger
}
func (w logWriteSyncer) Sync() error {
return w.Logger.Close()
}
func initLogger(config logConfig) *zap.Logger {
var writers []zapcore.WriteSyncer
if config.EnableLogToFile {
lr := &lumberjack.Logger{
Filename: config.File,
Compress: config.CompressRotated,
MaxSize: config.RotateBySizeMB, MaxAge: config.MaxDays,
MaxBackups: config.MaxCount,
}
if !config.EnableRotate {
lr.MaxSize = int(math.MaxInt32) // about 2 Petabytes. Really no reachable in this scenario.
}
writeSyncer := logWriteSyncer{lr}
writers = append(writers, writeSyncer)
}
if config.EnableLogToStdErr {
writer, _, err := zap.Open("stderr")
if err != nil {
panic("Can't open stderr to log")
}
writers = append(writers, writer)
}
encoder := zapcore.NewConsoleEncoder(zapcore.EncoderConfig{
TimeKey: "ts",
LevelKey: "level",
NameKey: "logger",
CallerKey: "caller",
MessageKey: "msg",
StacktraceKey: "stacktrace",
LineEnding: zapcore.DefaultLineEnding,
EncodeLevel: zapcore.LowercaseLevelEncoder,
EncodeTime: zapcore.ISO8601TimeEncoder,
EncodeDuration: zapcore.SecondsDurationEncoder,
EncodeCaller: zapcore.ShortCallerEncoder,
})
logLevel, errLogLevel := parseLogLevel(config.LogLevel)
core := zapcore.NewCore(encoder, zap.CombineWriteSyncers(writers...), logLevel)
logger := zap.New(core, getLogOptions(config)...)
log.InfoError(logger, errLogLevel, "Initialize log on level", zap.Stringer("level", logLevel))
return logger
}
func parseLogLevel(logLevelS string) (zapcore.Level, error) {
logLevelS = strings.TrimSpace(logLevelS)
logLevelS = strings.ToLower(logLevelS)
switch logLevelS { //nolint:wsl
case "debug":
return zapcore.DebugLevel, nil
case "info":
return zapcore.InfoLevel, nil
case "warning":
return zapcore.WarnLevel, nil
case "error":
return zapcore.ErrorLevel, nil
case "fatal":
return zapcore.FatalLevel, nil
default:
return zapcore.InfoLevel, errors.New("undefined log level")
}
}
func getLogOptions(config logConfig) (res []zap.Option) {
res = []zap.Option{
zap.AddCaller(),
}
if config.DeveloperMode {
res = append(res, zap.AddStacktrace(zapcore.WarnLevel), zap.Development())
} else {
res = append(res, zap.AddStacktrace(zapcore.ErrorLevel))
}
return res
}