/
zap.go
135 lines (114 loc) · 3.38 KB
/
zap.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
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
package base
import (
"io"
"time"
"github.com/KenmyZhang/pic_site_admin_server/pkg/global"
rotatelogs "github.com/lestrrat/go-file-rotatelogs"
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
)
//@author: [liuhongdi](https://github.com/liuhongdi)
func SetupLogger() *zap.SugaredLogger {
filepath := global.YSHOP_CONFIG.Zap.LogFilePath
infofilename := global.YSHOP_CONFIG.Zap.LogInfoFileName
warnfilename := global.YSHOP_CONFIG.Zap.LogWarnFileName
fileext := global.YSHOP_CONFIG.Zap.LogFileExt
Logger, _ := getInitLogger(filepath, infofilename, warnfilename, fileext)
defer Logger.Sync()
return Logger
}
// get logger
func getInitLogger(filepath, infofilename, warnfilename, fileext string) (*zap.SugaredLogger, error) {
encoder := getEncoder()
//两个判断日志等级的interface
//warnlevel以下属于info
infoLevel := zap.LevelEnablerFunc(func(lvl zapcore.Level) bool {
return lvl < zapcore.WarnLevel
})
//warnlevel及以上属于warn
warnLevel := zap.LevelEnablerFunc(func(lvl zapcore.Level) bool {
return lvl >= zapcore.WarnLevel
})
infoWriter, err := getLogWriter(filepath+"/"+infofilename, fileext)
if err != nil {
return nil, err
}
warnWriter, err2 := getLogWriter(filepath+"/"+warnfilename, fileext)
if err2 != nil {
return nil, err2
}
//创建具体的Logger
core := zapcore.NewTee(
zapcore.NewCore(encoder, infoWriter, infoLevel),
zapcore.NewCore(encoder, warnWriter, warnLevel),
)
loggerres := zap.New(core, zap.AddCaller())
return loggerres.Sugar(), nil
}
// get logger
func GetInitAccessLogger(filepath, filename, fileext string) (*zap.SugaredLogger, error) {
warnWriter, err2 := getLogWriter(filepath+"/"+filename, fileext)
if err2 != nil {
return nil, err2
}
var cfg zap.Config
cfg = zap.Config{
Level: zap.NewAtomicLevelAt(zap.DebugLevel),
Development: true,
Encoding: "console",
EncoderConfig: zapcore.EncoderConfig{
MessageKey: "msg",
},
OutputPaths: []string{"stdout", "./log.txt"},
ErrorOutputPaths: []string{"stderr"},
}
l, err := cfg.Build(SetOutput(warnWriter, cfg))
if err != nil {
panic(err)
}
return l.Sugar(), nil
}
func SetOutput(ws zapcore.WriteSyncer, conf zap.Config) zap.Option {
var enc zapcore.Encoder
switch conf.Encoding {
case "json":
enc = zapcore.NewJSONEncoder(conf.EncoderConfig)
case "console":
enc = zapcore.NewConsoleEncoder(conf.EncoderConfig)
default:
panic("unknown encoding")
}
return zap.WrapCore(func(core zapcore.Core) zapcore.Core {
return zapcore.NewCore(enc, ws, conf.Level)
})
}
// Encoder
func getEncoder() zapcore.Encoder {
encoderConfig := zap.NewProductionEncoderConfig()
encoderConfig.EncodeTime = zapcore.ISO8601TimeEncoder
encoderConfig.EncodeLevel = zapcore.CapitalLevelEncoder
return zapcore.NewConsoleEncoder(encoderConfig)
}
// LogWriter
func getLogWriter(filePath, fileext string) (zapcore.WriteSyncer, error) {
warnIoWriter, err := getWriter(filePath, fileext)
if err != nil {
return nil, err
}
return zapcore.AddSync(warnIoWriter), nil
}
// 日志文件切割,按天
func getWriter(filename, fileext string) (io.Writer, error) {
// 保存30天内的日志,每24小时(整点)分割一次日志
hook, err := rotatelogs.New(
filename+"_%Y%m%d."+fileext,
rotatelogs.WithLinkName(filename),
rotatelogs.WithMaxAge(time.Hour*24*30),
rotatelogs.WithRotationTime(time.Hour*24),
)
if err != nil {
//panic(err)
return nil, err
}
return hook, nil
}