-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathzap_log.go
109 lines (100 loc) · 2.42 KB
/
zap_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
106
107
108
109
package logx
import (
"os"
"sync"
"time"
"github.com/robfig/cron/v3"
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
"gopkg.in/natefinch/lumberjack.v2"
)
// var zlogger *zap.Logger
type zapLogger struct {
Logger *zap.Logger
lumLogger *lumberjack.Logger
}
var rotateCrondOnce sync.Once
// newZLogger init a zap logger
func newZapLogger(conf Config) zapLogger {
// maxage default 7 days
if config.MaxAge == 0 {
config.MaxAge = 7
}
if conf.File == "" {
conf.File = "./logs/run.log"
}
if conf.MaxBackups == 0 {
conf.MaxBackups = 15
}
// log rolling config
hook := lumberjack.Logger{
Filename: conf.File,
MaxSize: conf.MaxSize,
MaxBackups: conf.MaxBackups,
MaxAge: conf.MaxAge,
LocalTime: true,
Compress: conf.Compress,
}
// Multi writer
// lumberWriter and consoleWrite
var multiWriter zapcore.WriteSyncer
var writeSyncers []zapcore.WriteSyncer
if conf.Output == "file" {
writeSyncers = append(writeSyncers, zapcore.AddSync(&hook))
} else {
writeSyncers = append(writeSyncers, zapcore.AddSync(os.Stdout))
}
if len(writeSyncers) > 0 {
multiWriter = zapcore.NewMultiWriteSyncer(writeSyncers...)
}
// encoderConfig
encoderConfig := zapcore.EncoderConfig{
TimeKey: "time",
LevelKey: "level",
NameKey: "logger",
CallerKey: "caller",
FunctionKey: zapcore.OmitKey,
MessageKey: "msg",
StacktraceKey: "stacktrace",
LineEnding: zapcore.DefaultLineEnding,
EncodeLevel: zapcore.LowercaseLevelEncoder,
EncodeTime: func(t time.Time, encoder zapcore.PrimitiveArrayEncoder) {
encoder.AppendString(t.Format("2006-01-02 15:04:05"))
},
EncodeDuration: zapcore.SecondsDurationEncoder,
EncodeCaller: zapcore.FullCallerEncoder,
}
// logLevel
// Encoder console or json
enco := zapcore.NewJSONEncoder(encoderConfig)
var atomicLevel zap.AtomicLevel
if conf.Debug {
atomicLevel = zap.NewAtomicLevelAt(zap.DebugLevel)
} else {
atomicLevel = zap.NewAtomicLevelAt(zap.ErrorLevel)
}
// new core config
core := zapcore.NewCore(
enco,
multiWriter,
atomicLevel,
)
// new logger
logger := zap.New(core, zap.AddCaller(), zap.AddCallerSkip(1))
return zapLogger{
Logger: logger,
lumLogger: &hook,
}
}
// rotateCrond
func (zl zapLogger) rotateCrond(conf Config) {
if conf.Rotate != "" {
rotateCrondOnce.Do(func() {
cron := cron.New(cron.WithSeconds())
cron.AddFunc(conf.Rotate, func() {
zl.lumLogger.Rotate()
})
cron.Start()
})
}
}