/
new.go
112 lines (95 loc) · 2.92 KB
/
new.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
package log
import (
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
)
// Deprecated: use NewZapLogger instead
func NewLogger(config LogConfig) (*zap.Logger, error) {
return NewZapLogger(config)
}
// new zap logger
func NewZapLogger(config LogConfig) (*zap.Logger, error) {
setDefaultConfig(&config)
// init logger encoderConfig
var eConfig zapcore.Encoder
if config.Dev {
eConfig = getDevEncoder()
} else {
eConfig = getEncoder()
}
c := zapcore.NewTee(getZapCores(config, eConfig)...)
if config.Caller {
return zap.New(c, zap.AddCaller(), zap.AddCallerSkip(config.CallerSkip)), nil
}
return zap.New(c), nil
}
// new logger
func NewNormalLogger(config LogConfig) (Logger, error) {
logger, err := NewZapLogger(config)
if err != nil {
return nil, err
}
return nlog{zlog: zlog{logger}}, nil
}
func setDefaultConfig(config *LogConfig) error {
// parse level
var err error
config.level, err = zapcore.ParseLevel(config.Level)
if err != nil {
return err
}
if config.CallerSkip == 0 {
config.CallerSkip = 1
}
return nil
}
func getEncoder() zapcore.Encoder {
encoderConfig := zap.NewProductionEncoderConfig()
encoderConfig.EncodeTime = zapcore.RFC3339TimeEncoder
encoderConfig.EncodeLevel = zapcore.CapitalLevelEncoder
return zapcore.NewConsoleEncoder(encoderConfig)
}
func getDevEncoder() zapcore.Encoder {
encoderConfig := zap.NewDevelopmentEncoderConfig()
encoderConfig.EncodeTime = zapcore.RFC3339TimeEncoder
encoderConfig.EncodeLevel = zapcore.CapitalLevelEncoder
return zapcore.NewConsoleEncoder(encoderConfig)
}
func InitWithConfig(config LogConfig) error {
l, err := NewLogger(config)
if err != nil {
return err
}
Current = zlog{l}
Normal = nlog{Current}
return nil
}
func InitLog(level string) error {
return InitWithConfig(LogConfig{
Sync: true,
Level: level,
Caller: true,
Console: true,
NotToFile: false,
})
}
type LogNormalLevel struct {
Level zapcore.Level
MergeErrorLog bool
}
func (e LogNormalLevel) Enabled(lvl zapcore.Level) bool {
return e.Level <= lvl && (e.MergeErrorLog || lvl < zap.ErrorLevel)
}
type LogConfig struct {
Sync bool `json:"sync" yaml:"sync"` // 启用同步模式
Path string `json:"path" yaml:"path"` // 日志输出路径
MergeError bool `json:"mergeErr" yaml:"mergeErr"` // 合并错误日志到常规日志
ErrPath string `json:"errPath" yaml:"errPath"` // 错误日志输出路径
Console bool `json:"console" yaml:"console"` // 输出到控制台
NotToFile bool `json:"file" yaml:"file"` // 输出到文件
Level string `json:"level" yaml:"level"` // 日志级别
Dev bool `json:"dev" yaml:"dev"` // 开发模式
Caller bool `json:"caller" yaml:"caller"` // 输出调用者信息
CallerSkip int `json:"callerSkip" yaml:"callerSkip"` // 跳过调用者代码层级(适用于封装层)
level zapcore.Level
}