-
Notifications
You must be signed in to change notification settings - Fork 10
/
logger.go
142 lines (128 loc) · 2.76 KB
/
logger.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
136
137
138
139
140
141
142
package logger
import (
"github.com/flowshield/flowshield/ca/pkg/logger/redis_hook"
"github.com/pkg/errors"
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
)
var _ciCore zapcore.Core
var (
std *Logger
stdCallerFix *Logger
n *zap.Logger
)
// Logger
type Logger struct {
*zap.SugaredLogger
conf *Conf
}
// Conf to configure
type Conf struct {
Caller bool
Debug bool
Level zapcore.Level
Encoding string // json, console
AppInfo *ConfigAppData // fixed fields
HookConfig *redis_hook.HookConfig // set to nil if disabled
ZapConfig *zap.Config // for custom
}
type ConfigAppData struct {
AppName string
AppID string
AppVersion string
AppKey string
Channel string
SubOrgKey string
Language string
}
// Clone ...
func Clone(l *Logger) *Logger {
c := *l.conf
return &Logger{
SugaredLogger: l.SugaredLogger,
conf: &c,
}
}
// S Get singleton
func S() *Logger {
return std
}
// N Zap Logger
func N() *zap.Logger {
return n
}
// GlobalConfig init
func GlobalConfig(conf Conf) error {
c := conf
l, err := newLogger(&c)
if err != nil {
return err
}
std = &Logger{
SugaredLogger: l.Sugar(),
conf: &c,
}
stdCallerFix = &Logger{
SugaredLogger: l.WithOptions(zap.AddCallerSkip(1)).Sugar(),
conf: &c,
}
n = std.Desugar()
return nil
}
func init() {
l, _ := newLogger(&Conf{
Level: zapcore.InfoLevel,
})
std = &Logger{
SugaredLogger: l.Sugar(),
conf: &Conf{},
}
stdCallerFix = &Logger{
SugaredLogger: l.WithOptions(zap.AddCallerSkip(1)).Sugar(),
conf: &Conf{},
}
n = std.Desugar()
}
// NewZapLogger Create custom Logger
func NewZapLogger(c *Conf) (l *zap.Logger, err error) {
return newLogger(c)
}
func newLogger(c *Conf) (l *zap.Logger, err error) {
var conf zap.Config
if c.ZapConfig != nil {
conf = *c.ZapConfig
} else {
conf = zap.NewProductionConfig()
conf.EncoderConfig = zap.NewDevelopmentEncoderConfig()
if c.Debug {
conf = zap.NewDevelopmentConfig()
conf.EncoderConfig.EncodeLevel = zapcore.CapitalColorLevelEncoder
}
if c.Encoding != "" {
conf.Encoding = c.Encoding
} else {
conf.Encoding = "console"
}
}
conf.Level = zap.NewAtomicLevelAt(c.Level)
if c.HookConfig != nil {
hook, err := redis_hook.NewHook(*c.HookConfig)
if err != nil {
return nil, err
}
_ciCore = NewCiCore(hook)
l, err = conf.Build(zap.WrapCore(func(core zapcore.Core) zapcore.Core {
return zapcore.NewTee(core, _ciCore)
}))
if err != nil {
return nil, errors.Wrap(err, "zap core init error")
}
} else {
l, err = conf.Build()
}
if err != nil {
return nil, errors.Wrap(err, "zap core init error")
}
l = l.WithOptions(zap.WithCaller(c.Caller), zap.AddStacktrace(zapcore.ErrorLevel))
return
}