Skip to content

Commit aa80241

Browse files
authored
* - 修复issues flipped-aurora#1118 - zap日志无法按照等级出现在对应log文件中 - zap.AddCaller()只有在global.GVA_CONFIG.Zap.ShowLine为true才生效 - rotatelogs.ForceNewFile(),取消这个, 这样每次启动不会出现同一天日志级别.1后缀的新文件 * 等级使用Transport进行转换,优化臃肿代码,优雅获取zapcore.Core
1 parent 3ec886d commit aa80241

File tree

4 files changed

+156
-88
lines changed

4 files changed

+156
-88
lines changed

server/config/zap.go

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
package config
22

3+
import (
4+
"go.uber.org/zap/zapcore"
5+
"strings"
6+
)
7+
38
type Zap struct {
49
Level string `mapstructure:"level" json:"level" yaml:"level"` // 级别
510
Prefix string `mapstructure:"prefix" json:"prefix" yaml:"prefix"` // 日志前缀
@@ -12,3 +17,44 @@ type Zap struct {
1217
ShowLine bool `mapstructure:"show-line" json:"show-line" yaml:"show-line"` // 显示行
1318
LogInConsole bool `mapstructure:"log-in-console" json:"log-in-console" yaml:"log-in-console"` // 输出控制台
1419
}
20+
21+
// ZapEncodeLevel 根据 EncodeLevel 返回 zapcore.LevelEncoder
22+
// Author [SliverHorn](https://github.com/SliverHorn)
23+
func (z *Zap) ZapEncodeLevel() zapcore.LevelEncoder {
24+
switch {
25+
case z.EncodeLevel == "LowercaseLevelEncoder": // 小写编码器(默认)
26+
return zapcore.LowercaseLevelEncoder
27+
case z.EncodeLevel == "LowercaseColorLevelEncoder": // 小写编码器带颜色
28+
return zapcore.LowercaseColorLevelEncoder
29+
case z.EncodeLevel == "CapitalLevelEncoder": // 大写编码器
30+
return zapcore.CapitalLevelEncoder
31+
case z.EncodeLevel == "CapitalColorLevelEncoder": // 大写编码器带颜色
32+
return zapcore.CapitalColorLevelEncoder
33+
default:
34+
return zapcore.LowercaseLevelEncoder
35+
}
36+
}
37+
38+
// TransportLevel 根据字符串转化为 zapcore.Level
39+
// Author [SliverHorn](https://github.com/SliverHorn)
40+
func (z *Zap) TransportLevel() zapcore.Level {
41+
z.Level = strings.ToLower(z.Level)
42+
switch z.Level {
43+
case "debug":
44+
return zapcore.DebugLevel
45+
case "info":
46+
return zapcore.InfoLevel
47+
case "warn":
48+
return zapcore.WarnLevel
49+
case "error":
50+
return zapcore.WarnLevel
51+
case "dpanic":
52+
return zapcore.DPanicLevel
53+
case "panic":
54+
return zapcore.PanicLevel
55+
case "fatal":
56+
return zapcore.FatalLevel
57+
default:
58+
return zapcore.DebugLevel
59+
}
60+
}

server/core/internal/file_rotatelogs.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ type fileRotatelogs struct{}
1818
func (r *fileRotatelogs) GetWriteSyncer(level string) (zapcore.WriteSyncer, error) {
1919
fileWriter, err := rotatelogs.New(
2020
path.Join(global.GVA_CONFIG.Zap.Director, "%Y-%m-%d", level+".log"),
21-
rotatelogs.ForceNewFile(),
2221
rotatelogs.WithClock(rotatelogs.Local),
2322
rotatelogs.WithMaxAge(time.Duration(global.GVA_CONFIG.Zap.MaxAge)*24*time.Hour), // 日志留存时间
2423
rotatelogs.WithRotationTime(time.Hour*24),

server/core/internal/zap.go

Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
package internal
2+
3+
import (
4+
"fmt"
5+
"github.com/flipped-aurora/gin-vue-admin/server/global"
6+
"go.uber.org/zap"
7+
"go.uber.org/zap/zapcore"
8+
"time"
9+
)
10+
11+
var Zap = new(_zap)
12+
13+
type _zap struct{}
14+
15+
// GetEncoder 获取 zapcore.Encoder
16+
// Author [SliverHorn](https://github.com/SliverHorn)
17+
func (z *_zap) GetEncoder() zapcore.Encoder {
18+
if global.GVA_CONFIG.Zap.Format == "json" {
19+
return zapcore.NewJSONEncoder(z.GetEncoderConfig())
20+
}
21+
return zapcore.NewConsoleEncoder(z.GetEncoderConfig())
22+
}
23+
24+
// GetEncoderConfig 获取zapcore.EncoderConfig
25+
// Author [SliverHorn](https://github.com/SliverHorn)
26+
func (z *_zap) GetEncoderConfig() zapcore.EncoderConfig {
27+
return zapcore.EncoderConfig{
28+
MessageKey: "message",
29+
LevelKey: "level",
30+
TimeKey: "time",
31+
NameKey: "logger",
32+
CallerKey: "caller",
33+
StacktraceKey: global.GVA_CONFIG.Zap.StacktraceKey,
34+
LineEnding: zapcore.DefaultLineEnding,
35+
EncodeLevel: global.GVA_CONFIG.Zap.ZapEncodeLevel(),
36+
EncodeTime: z.CustomTimeEncoder,
37+
EncodeDuration: zapcore.SecondsDurationEncoder,
38+
EncodeCaller: zapcore.FullCallerEncoder,
39+
}
40+
}
41+
42+
// GetEncoderCore 获取Encoder的 zapcore.Core
43+
// Author [SliverHorn](https://github.com/SliverHorn)
44+
func (z *_zap) GetEncoderCore(l zapcore.Level, level zap.LevelEnablerFunc) zapcore.Core {
45+
writer, err := FileRotatelogs.GetWriteSyncer(l.String()) // 使用file-rotatelogs进行日志分割
46+
if err != nil {
47+
fmt.Printf("Get Write Syncer Failed err:%v", err.Error())
48+
return nil
49+
}
50+
51+
return zapcore.NewCore(z.GetEncoder(), writer, level)
52+
}
53+
54+
// CustomTimeEncoder 自定义日志输出时间格式
55+
// Author [SliverHorn](https://github.com/SliverHorn)
56+
func (z *_zap) CustomTimeEncoder(t time.Time, encoder zapcore.PrimitiveArrayEncoder) {
57+
encoder.AppendString(t.Format(global.GVA_CONFIG.Zap.Prefix + "2006/01/02 - 15:04:05.000"))
58+
}
59+
60+
// GetZapCores 根据配置文件的Level获取 []zapcore.Core
61+
// Author [SliverHorn](https://github.com/SliverHorn)
62+
func (z *_zap) GetZapCores() []zapcore.Core {
63+
cores := make([]zapcore.Core, 0, 7)
64+
for level := global.GVA_CONFIG.Zap.TransportLevel(); level <= zapcore.FatalLevel; level++ {
65+
cores = append(cores, z.GetEncoderCore(level, z.GetLevelPriority(level)))
66+
}
67+
return cores
68+
}
69+
70+
// GetLevelPriority 根据 zapcore.Level 获取 zap.LevelEnablerFunc
71+
// Author [SliverHorn](https://github.com/SliverHorn)
72+
func (z *_zap) GetLevelPriority(level zapcore.Level) zap.LevelEnablerFunc {
73+
switch level {
74+
case zapcore.DebugLevel:
75+
return func(level zapcore.Level) bool { // 调试级别
76+
return level == zap.DebugLevel
77+
}
78+
case zapcore.InfoLevel:
79+
return func(level zapcore.Level) bool { // 日志级别
80+
return level == zap.InfoLevel
81+
}
82+
case zapcore.WarnLevel:
83+
return func(level zapcore.Level) bool { // 警告级别
84+
return level == zap.WarnLevel
85+
}
86+
case zapcore.ErrorLevel:
87+
return func(level zapcore.Level) bool { // 错误级别
88+
return level == zap.ErrorLevel
89+
}
90+
case zapcore.DPanicLevel:
91+
return func(level zapcore.Level) bool { // dpanic级别
92+
return level == zap.DPanicLevel
93+
}
94+
case zapcore.PanicLevel:
95+
return func(level zapcore.Level) bool { // panic级别
96+
return level == zap.PanicLevel
97+
}
98+
case zapcore.FatalLevel:
99+
return func(level zapcore.Level) bool { // 终止级别
100+
return level == zap.FatalLevel
101+
}
102+
default:
103+
return func(level zapcore.Level) bool { // 调试级别
104+
return level == zap.DebugLevel
105+
}
106+
}
107+
}

server/core/zap.go

Lines changed: 3 additions & 87 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,11 @@ package core
33
import (
44
"fmt"
55
"github.com/flipped-aurora/gin-vue-admin/server/core/internal"
6-
"os"
7-
"time"
8-
96
"github.com/flipped-aurora/gin-vue-admin/server/global"
107
"github.com/flipped-aurora/gin-vue-admin/server/utils"
118
"go.uber.org/zap"
129
"go.uber.org/zap/zapcore"
10+
"os"
1311
)
1412

1513
// Zap 获取 zap.Logger
@@ -20,93 +18,11 @@ func Zap() (logger *zap.Logger) {
2018
_ = os.Mkdir(global.GVA_CONFIG.Zap.Director, os.ModePerm)
2119
}
2220

23-
cores := make([]zapcore.Core, 0, 7)
24-
debugLevel := getEncoderCore(zap.DebugLevel)
25-
infoLevel := getEncoderCore(zap.InfoLevel)
26-
warnLevel := getEncoderCore(zap.WarnLevel)
27-
errorLevel := getEncoderCore(zap.ErrorLevel)
28-
dPanicLevel := getEncoderCore(zap.DPanicLevel)
29-
panicLevel := getEncoderCore(zap.PanicLevel)
30-
fatalLevel := getEncoderCore(zap.FatalLevel)
31-
switch global.GVA_CONFIG.Zap.Level {
32-
case "debug", "DEBUG":
33-
cores = append(cores, debugLevel, infoLevel, warnLevel, errorLevel, dPanicLevel, panicLevel, fatalLevel)
34-
case "info", "INFO":
35-
cores = append(cores, infoLevel, warnLevel, errorLevel, dPanicLevel, panicLevel, fatalLevel)
36-
case "warn", "WARN":
37-
cores = append(cores, warnLevel, errorLevel, dPanicLevel, panicLevel, fatalLevel)
38-
case "error", "ERROR":
39-
cores = append(cores, errorLevel, dPanicLevel, panicLevel, fatalLevel)
40-
case "dpanic", "DPANIC":
41-
cores = append(cores, dPanicLevel, panicLevel, fatalLevel)
42-
case "panic", "PANIC":
43-
cores = append(cores, panicLevel, fatalLevel)
44-
case "fatal", "FATAL":
45-
cores = append(cores, panicLevel, fatalLevel)
46-
default:
47-
cores = append(cores, debugLevel, infoLevel, warnLevel, errorLevel, dPanicLevel, panicLevel, fatalLevel)
48-
}
49-
logger = zap.New(zapcore.NewTee(cores...), zap.AddCaller())
21+
cores := internal.Zap.GetZapCores()
22+
logger = zap.New(zapcore.NewTee(cores...))
5023

5124
if global.GVA_CONFIG.Zap.ShowLine {
5225
logger = logger.WithOptions(zap.AddCaller())
5326
}
5427
return logger
5528
}
56-
57-
// getEncoderConfig 获取zapcore.EncoderConfig
58-
// Author [SliverHorn](https://github.com/SliverHorn)
59-
func getEncoderConfig() (config zapcore.EncoderConfig) {
60-
config = zapcore.EncoderConfig{
61-
MessageKey: "message",
62-
LevelKey: "level",
63-
TimeKey: "time",
64-
NameKey: "logger",
65-
CallerKey: "caller",
66-
StacktraceKey: global.GVA_CONFIG.Zap.StacktraceKey,
67-
LineEnding: zapcore.DefaultLineEnding,
68-
EncodeLevel: zapcore.LowercaseLevelEncoder,
69-
EncodeTime: CustomTimeEncoder,
70-
EncodeDuration: zapcore.SecondsDurationEncoder,
71-
EncodeCaller: zapcore.FullCallerEncoder,
72-
}
73-
switch {
74-
case global.GVA_CONFIG.Zap.EncodeLevel == "LowercaseLevelEncoder": // 小写编码器(默认)
75-
config.EncodeLevel = zapcore.LowercaseLevelEncoder
76-
case global.GVA_CONFIG.Zap.EncodeLevel == "LowercaseColorLevelEncoder": // 小写编码器带颜色
77-
config.EncodeLevel = zapcore.LowercaseColorLevelEncoder
78-
case global.GVA_CONFIG.Zap.EncodeLevel == "CapitalLevelEncoder": // 大写编码器
79-
config.EncodeLevel = zapcore.CapitalLevelEncoder
80-
case global.GVA_CONFIG.Zap.EncodeLevel == "CapitalColorLevelEncoder": // 大写编码器带颜色
81-
config.EncodeLevel = zapcore.CapitalColorLevelEncoder
82-
default:
83-
config.EncodeLevel = zapcore.LowercaseLevelEncoder
84-
}
85-
return config
86-
}
87-
88-
// getEncoder 获取zapcore.Encoder
89-
// Author [SliverHorn](https://github.com/SliverHorn)
90-
func getEncoder() zapcore.Encoder {
91-
if global.GVA_CONFIG.Zap.Format == "json" {
92-
return zapcore.NewJSONEncoder(getEncoderConfig())
93-
}
94-
return zapcore.NewConsoleEncoder(getEncoderConfig())
95-
}
96-
97-
// getEncoderCore 获取Encoder的zapcore.Core
98-
// Author [SliverHorn](https://github.com/SliverHorn)
99-
func getEncoderCore(level zapcore.Level) (core zapcore.Core) {
100-
writer, err := internal.FileRotatelogs.GetWriteSyncer(level.String()) // 使用file-rotatelogs进行日志分割
101-
if err != nil {
102-
fmt.Printf("Get Write Syncer Failed err:%v", err.Error())
103-
return
104-
}
105-
return zapcore.NewCore(getEncoder(), writer, level)
106-
}
107-
108-
// CustomTimeEncoder 自定义日志输出时间格式
109-
// Author [SliverHorn](https://github.com/SliverHorn)
110-
func CustomTimeEncoder(t time.Time, enc zapcore.PrimitiveArrayEncoder) {
111-
enc.AppendString(t.Format(global.GVA_CONFIG.Zap.Prefix + "2006/01/02 - 15:04:05.000"))
112-
}

0 commit comments

Comments
 (0)