Skip to content

Commit aeb3994

Browse files
authored
[patch] add global log level configuration interface SetLevel (#98)
Signed-off-by: kpango <[email protected]>
1 parent 74fd321 commit aeb3994

File tree

6 files changed

+176
-55
lines changed

6 files changed

+176
-55
lines changed

Diff for: README.md

+9
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,15 @@ func main() {
100100
glg.Print("Print")
101101
glg.Println("Println")
102102
glg.Printf("%s : %s", "printf", "formatted")
103+
104+
// set global log level to ERR level
105+
glg.Info("before setting level to ERR this message will show")
106+
glg.Get().SetLevel(glg.ERR)
107+
glg.Info("after setting level to ERR this message will not show")
108+
glg.Error("this log is ERR level this will show")
109+
glg.Get().SetLevel(glg.DEBG)
110+
glg.Info("log level is now DEBG, this INFO level log will show")
111+
103112
glg.CustomLog(customTag, "custom logging")
104113
glg.CustomLog(customErrTag, "custom error logging")
105114

Diff for: example/main.go

+18-8
Original file line numberDiff line numberDiff line change
@@ -120,13 +120,9 @@ func main() {
120120
// SetLevelWriter(glg.WARN, customWriter).
121121
// SetLevelWriter(glg.ERR, customWriter).
122122
// EnableJSON().
123-
AddLevelWriter(glg.INFO, infolog). // add info log file destination
124-
AddLevelWriter(glg.ERR, errlog). // add error log file destination
125-
AddLevelWriter(glg.WARN, rotate). // add error log file destination
126-
AddStdLevel(customTag, glg.STD, false). // user custom log level
127-
AddErrLevel(customErrTag, glg.STD, true). // user custom error log level
128-
SetLevelColor(glg.TagStringToLevel(customTag), glg.Cyan). // set color output to user custom level
129-
SetLevelColor(glg.TagStringToLevel(customErrTag), glg.Red) // set color output to user custom level
123+
AddLevelWriter(glg.INFO, infolog). // add info log file destination
124+
AddLevelWriter(glg.ERR, errlog). // add error log file destination
125+
AddLevelWriter(glg.WARN, rotate) // add error log file destination
130126

131127
glg.Info("info")
132128
glg.Infof("%s : %s", "info", "formatted")
@@ -145,10 +141,24 @@ func main() {
145141
glg.Print("Print")
146142
glg.Println("Println")
147143
glg.Printf("%s : %s", "printf", "formatted")
144+
145+
// set global log level to ERR level
146+
glg.Info("before setting level to ERR this message will show")
147+
glg.Get().SetLevel(glg.ERR)
148+
glg.Info("after setting level to ERR this message will not show")
149+
glg.Error("this log is ERR level this will show")
150+
glg.Get().SetLevel(glg.DEBG)
151+
glg.Info("log level is now DEBG, this INFO level log will show")
152+
153+
glg.Get().
154+
AddStdLevel(customTag, glg.STD, false). // user custom log level
155+
AddErrLevel(customErrTag, glg.STD, true). // user custom error log level
156+
SetLevelColor(glg.TagStringToLevel(customTag), glg.Cyan). // set color output to user custom level
157+
SetLevelColor(glg.TagStringToLevel(customErrTag), glg.Red) // set color output to user custom level
148158
glg.CustomLog(customTag, "custom logging")
149159
glg.CustomLog(customErrTag, "custom error logging")
150160

151-
glg.Info("kpango's glg supports disable timestamp for logging")
161+
// glg.Info("kpango's glg supports disable timestamp for logging")
152162
glg.Get().DisableTimestamp()
153163
glg.Info("timestamp disabled")
154164
glg.Warn("timestamp disabled")

Diff for: glg.go

+50-40
Original file line numberDiff line numberDiff line change
@@ -73,19 +73,20 @@ type logger struct {
7373
color func(string) string
7474
isColor bool
7575
mode MODE
76+
prevMode MODE
7677
writeMode wMode
7778
disableTimestamp bool
7879
}
7980

8081
const (
81-
// LOG is log level
82-
LOG LEVEL = iota
82+
// DEBG is debug log level
83+
DEBG LEVEL = iota + 1
8384
// PRINT is print log level
8485
PRINT
86+
// LOG is log level
87+
LOG
8588
// INFO is info log level
8689
INFO
87-
// DEBG is debug log level
88-
DEBG
8990
// OK is success notify log level
9091
OK
9192
// WARN is warning log level
@@ -98,7 +99,7 @@ const (
9899
FATAL
99100

100101
// NONE is disable Logging
101-
NONE MODE = iota
102+
NONE MODE = iota + 1
102103
// STD is std log mode
103104
STD
104105
// BOTH is both log mode
@@ -107,7 +108,7 @@ const (
107108
WRITER
108109

109110
// Internal writeMode
110-
writeColorStd wMode = iota
111+
writeColorStd wMode = iota + 1
111112
writeStd
112113
writeWriter
113114
writeColorBoth
@@ -149,14 +150,14 @@ func init() {
149150

150151
func (l LEVEL) String() string {
151152
switch l {
152-
case LOG:
153-
return "LOG"
153+
case DEBG:
154+
return "DEBG"
154155
case PRINT:
155156
return "PRINT"
157+
case LOG:
158+
return "LOG"
156159
case INFO:
157160
return "INFO"
158-
case DEBG:
159-
return "DEBG"
160161
case OK:
161162
return "OK"
162163
case WARN:
@@ -208,6 +209,12 @@ func New() *Glg {
208209

209210
for lev, log := range map[LEVEL]*logger{
210211
// standard out
212+
DEBG: {
213+
std: os.Stdout,
214+
color: Purple,
215+
isColor: true,
216+
mode: STD,
217+
},
211218
PRINT: {
212219
std: os.Stdout,
213220
color: Colorless,
@@ -226,12 +233,6 @@ func New() *Glg {
226233
isColor: true,
227234
mode: STD,
228235
},
229-
DEBG: {
230-
std: os.Stdout,
231-
color: Purple,
232-
isColor: true,
233-
mode: STD,
234-
},
235236
OK: {
236237
std: os.Stdout,
237238
color: Cyan,
@@ -266,6 +267,7 @@ func New() *Glg {
266267
} {
267268
log.tag = lev.String()
268269
log.rawtag = []byte(lsep + log.tag + sep)
270+
log.prevMode = log.mode
269271
log.updateMode()
270272
g.logger.Store(lev, log)
271273
}
@@ -299,10 +301,27 @@ func (g *Glg) EnablePoolBuffer(size int) *Glg {
299301
return g
300302
}
301303

304+
// SetLevel sets glg global log level
305+
func (g *Glg) SetLevel(lv LEVEL) *Glg {
306+
g.logger.Range(func(lev LEVEL, l *logger) bool {
307+
if lev < lv {
308+
l.prevMode = l.mode
309+
l.mode = NONE
310+
} else {
311+
l.mode = l.prevMode
312+
}
313+
l.updateMode()
314+
g.logger.Store(lev, l)
315+
return true
316+
})
317+
return g
318+
}
319+
302320
// SetMode sets glg logging mode
303321
func (g *Glg) SetMode(mode MODE) *Glg {
304322
g.logger.Range(func(lev LEVEL, l *logger) bool {
305323
l.mode = mode
324+
l.prevMode = mode
306325
l.updateMode()
307326
g.logger.Store(lev, l)
308327
return true
@@ -316,6 +335,7 @@ func (g *Glg) SetLevelMode(level LEVEL, mode MODE) *Glg {
316335
l, ok := g.logger.Load(level)
317336
if ok {
318337
l.mode = mode
338+
l.prevMode = mode
319339
l.updateMode()
320340
g.logger.Store(level, l)
321341
}
@@ -443,37 +463,27 @@ func (g *Glg) AddLevelWriter(level LEVEL, writer io.Writer) *Glg {
443463

444464
// AddStdLevel adds std log level and returns LEVEL
445465
func (g *Glg) AddStdLevel(tag string, mode MODE, isColor bool) *Glg {
446-
lev := LEVEL(atomic.AddUint32(g.levelCounter, 1))
447-
tag = strings.ToUpper(tag)
448-
g.levelMap.Store(tag, lev)
449-
l := &logger{
450-
writer: nil,
451-
std: os.Stdout,
452-
color: Colorless,
453-
isColor: isColor,
454-
mode: mode,
455-
tag: tag,
456-
rawtag: []byte(lsep + tag + sep),
457-
}
458-
l.updateMode()
459-
g.logger.Store(lev, l)
460-
return g
466+
return g.addLevel(tag, mode, isColor, os.Stdout)
461467
}
462468

463469
// AddErrLevel adds error log level and returns LEVEL
464470
func (g *Glg) AddErrLevel(tag string, mode MODE, isColor bool) *Glg {
465-
atomic.AddUint32(g.levelCounter, 1)
466-
lev := LEVEL(atomic.LoadUint32(g.levelCounter))
471+
return g.addLevel(tag, mode, isColor, os.Stderr)
472+
}
473+
474+
func (g *Glg) addLevel(tag string, mode MODE, isColor bool, std io.Writer) *Glg {
475+
lev := LEVEL(atomic.AddUint32(g.levelCounter, 1))
467476
tag = strings.ToUpper(tag)
468477
g.levelMap.Store(tag, lev)
469478
l := &logger{
470-
writer: nil,
471-
std: os.Stderr,
472-
color: Red,
473-
isColor: isColor,
474-
mode: mode,
475-
tag: tag,
476-
rawtag: []byte(lsep + tag + sep),
479+
writer: nil,
480+
std: std,
481+
color: Colorless,
482+
isColor: isColor,
483+
mode: mode,
484+
prevMode: mode,
485+
tag: tag,
486+
rawtag: []byte(lsep + tag + sep),
477487
}
478488
l.updateMode()
479489
g.logger.Store(lev, l)

Diff for: glg_test.go

+96
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,102 @@ func TestGlg_SetMode(t *testing.T) {
178178
}
179179
}
180180

181+
func TestGlg_SetLevel(t *testing.T) {
182+
tests := []struct {
183+
name string
184+
level LEVEL
185+
lv LEVEL
186+
expect MODE
187+
}{
188+
{
189+
name: "debug mode enables all",
190+
level: DEBG,
191+
lv: LOG,
192+
expect: STD,
193+
},
194+
{
195+
name: "WARN mode disables ok",
196+
level: WARN,
197+
lv: OK,
198+
expect: NONE,
199+
},
200+
{
201+
name: "WARN mode disables info",
202+
level: WARN,
203+
lv: INFO,
204+
expect: NONE,
205+
},
206+
{
207+
name: "WARN mode disables log",
208+
level: WARN,
209+
lv: LOG,
210+
expect: NONE,
211+
},
212+
{
213+
name: "WARN mode disables print",
214+
level: WARN,
215+
lv: PRINT,
216+
expect: NONE,
217+
},
218+
{
219+
name: "WARN mode disables debug",
220+
level: WARN,
221+
lv: DEBG,
222+
expect: NONE,
223+
},
224+
{
225+
name: "FATAL mode disables fail",
226+
level: FATAL,
227+
lv: FAIL,
228+
expect: NONE,
229+
},
230+
{
231+
name: "FATAL mode disables err",
232+
level: FATAL,
233+
lv: ERR,
234+
expect: NONE,
235+
},
236+
{
237+
name: "FATAL mode disables ok",
238+
level: FATAL,
239+
lv: OK,
240+
expect: NONE,
241+
},
242+
{
243+
name: "FATAL mode disables info",
244+
level: FATAL,
245+
lv: INFO,
246+
expect: NONE,
247+
},
248+
{
249+
name: "FATAL mode disables log",
250+
level: FATAL,
251+
lv: LOG,
252+
expect: NONE,
253+
},
254+
{
255+
name: "FATAL mode disables print",
256+
level: FATAL,
257+
lv: PRINT,
258+
expect: NONE,
259+
},
260+
{
261+
name: "FATAL mode disables debug",
262+
level: FATAL,
263+
lv: DEBG,
264+
expect: NONE,
265+
},
266+
}
267+
g := New()
268+
for _, tt := range tests {
269+
t.Run(tt.name, func(t *testing.T) {
270+
if got := g.SetLevel(tt.level).GetCurrentMode(tt.lv); got != tt.expect {
271+
t.Errorf("Glg.SetLevel() = %v, want %v", got, tt.expect)
272+
}
273+
})
274+
}
275+
}
276+
181277
func TestGlg_SetLevelMode(t *testing.T) {
182278
tests := []struct {
183279
name string

Diff for: go.mod

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ module github.com/kpango/glg
33
go 1.16
44

55
require (
6-
github.com/goccy/go-json v0.6.1
6+
github.com/goccy/go-json v0.7.0
77
github.com/kpango/fastime v1.0.16
88
go.uber.org/zap v1.17.0
99
)

Diff for: go.sum

+2-6
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,8 @@
11
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
22
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
33
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
4-
github.com/goccy/go-json v0.5.1 h1:R9UYTOUvo7eIY9aeDMZ4L6OVtHaSr1k2No9W6MKjXrA=
5-
github.com/goccy/go-json v0.5.1/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
6-
github.com/goccy/go-json v0.6.0 h1:2IW/fnWqWQVWsoNEO708sGt7udTIjuBgCB/psq8L8Xo=
7-
github.com/goccy/go-json v0.6.0/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
8-
github.com/goccy/go-json v0.6.1 h1:O7xC9WR7B09imThbRIEMIWK4MVcxOsLzWtGe16cv5SU=
9-
github.com/goccy/go-json v0.6.1/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
4+
github.com/goccy/go-json v0.7.0 h1:ZsGt0RuL2c4EP8X33Ij8caSlBrcFx7eYKjlKG4HOWf8=
5+
github.com/goccy/go-json v0.7.0/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
106
github.com/kpango/fastime v1.0.16 h1:1prFG/3pTjzcDeCTxt98VB4IvjxcySLs0ldCEhZg0R8=
117
github.com/kpango/fastime v1.0.16/go.mod h1:lVqUTcXmQnk1wriyvq5DElbRSRDC0XtqbXQRdz0Eo+g=
128
github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I=

0 commit comments

Comments
 (0)