Skip to content

Commit fcb2a29

Browse files
author
kpango
committed
add feature level enable/disable switching
1 parent aabff45 commit fcb2a29

File tree

2 files changed

+137
-45
lines changed

2 files changed

+137
-45
lines changed

glg.go

+63-25
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@ type Glg struct {
1919
// writer for stdout or stderr
2020
std map[string]io.Writer
2121
colors map[string]func(string) string
22-
mode int
23-
isColor bool
22+
isColor map[string]bool
23+
mode map[string]int
2424
mu *sync.Mutex
2525
}
2626

@@ -95,9 +95,33 @@ func New() *Glg {
9595
FAIL: Red,
9696
FATAL: Red,
9797
},
98-
mode: STD,
99-
isColor: true,
100-
mu: new(sync.Mutex),
98+
isColor: map[string]bool{
99+
// standard out
100+
PRINT: true,
101+
LOG: true,
102+
INFO: true,
103+
DEBG: true,
104+
OK: true,
105+
WARN: true,
106+
// error out
107+
ERR: true,
108+
FAIL: true,
109+
FATAL: true,
110+
},
111+
mode: map[string]int{
112+
// standard out
113+
PRINT: STD,
114+
LOG: STD,
115+
INFO: STD,
116+
DEBG: STD,
117+
OK: STD,
118+
WARN: STD,
119+
// error out
120+
ERR: STD,
121+
FAIL: STD,
122+
FATAL: STD,
123+
},
124+
mu: new(sync.Mutex),
101125
})
102126
}
103127

@@ -112,14 +136,24 @@ func Get() *Glg {
112136
// SetMode sets glg logging mode
113137
func (g *Glg) SetMode(mode int) *Glg {
114138
g.mu.Lock()
115-
g.mode = mode
139+
for level := range g.mode {
140+
g.mode[level] = mode
141+
}
142+
g.mu.Unlock()
143+
return g
144+
}
145+
146+
// SetLevelMode set glg logging mode per level
147+
func (g *Glg) SetLevelMode(level string, mode int) *Glg {
148+
g.mu.Lock()
149+
g.mode[level] = mode
116150
g.mu.Unlock()
117151
return g
118152
}
119153

120154
// GetCurrentMode returns current logging mode
121-
func (g *Glg) GetCurrentMode() int {
122-
return g.mode
155+
func (g *Glg) GetCurrentMode(level string) int {
156+
return g.mode[level]
123157
}
124158

125159
// InitWriter is initialize glg writer
@@ -205,35 +239,45 @@ func (g *Glg) AddLevelWriter(level string, writer io.Writer) *Glg {
205239
}
206240

207241
// AddStdLevel adds std log level
208-
func (g *Glg) AddStdLevel(level string) *Glg {
242+
func (g *Glg) AddStdLevel(level string, mode int, isColor bool) *Glg {
209243
g.mu.Lock()
210-
defer g.mu.Unlock()
211244
g.writer[level] = g.writer[INFO]
212245
g.std[level] = os.Stdout
246+
g.mode[level] = mode
247+
g.colors[level] = Colorless
248+
g.isColor[level] = isColor
249+
g.mu.Unlock()
213250
return g
214251
}
215252

216253
// AddErrLevel adds error log level
217-
func (g *Glg) AddErrLevel(level string) *Glg {
254+
func (g *Glg) AddErrLevel(level string, mode int, isColor bool) *Glg {
218255
g.mu.Lock()
219-
defer g.mu.Unlock()
220256
g.writer[level] = g.writer[ERR]
221257
g.std[level] = os.Stderr
258+
g.mode[level] = mode
259+
g.colors[level] = Red
260+
g.isColor[level] = isColor
261+
g.mu.Unlock()
222262
return g
223263
}
224264

225265
// EnableColor enables color output
226266
func (g *Glg) EnableColor() *Glg {
227267
g.mu.Lock()
228-
g.isColor = true
268+
for level := range g.isColor {
269+
g.isColor[level] = true
270+
}
229271
g.mu.Unlock()
230272
return g
231273
}
232274

233275
// DisableColor disables color output
234276
func (g *Glg) DisableColor() *Glg {
235277
g.mu.Lock()
236-
g.isColor = false
278+
for level := range g.isColor {
279+
g.isColor[level] = false
280+
}
237281
g.mu.Unlock()
238282
return g
239283
}
@@ -275,10 +319,6 @@ func FileWriter(path string, perm os.FileMode) *os.File {
275319

276320
// HTTPLogger is simple http access logger
277321
func (g *Glg) HTTPLogger(name string, handler http.Handler) http.Handler {
278-
if g.mode == NONE {
279-
return handler
280-
}
281-
282322
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
283323
start := time.Now()
284324

@@ -298,9 +338,6 @@ func (g *Glg) HTTPLogger(name string, handler http.Handler) http.Handler {
298338

299339
// HTTPLoggerFunc is simple http access logger
300340
func (g *Glg) HTTPLoggerFunc(name string, hf http.HandlerFunc) http.Handler {
301-
if g.mode == NONE {
302-
return hf
303-
}
304341
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
305342
start := time.Now()
306343

@@ -384,7 +421,7 @@ func White(str string) string {
384421
}
385422

386423
func (g *Glg) out(level, format string, val ...interface{}) error {
387-
if g.mode == NONE {
424+
if g.mode[level] == NONE {
388425
return nil
389426
}
390427

@@ -396,8 +433,9 @@ func (g *Glg) out(level, format string, val ...interface{}) error {
396433

397434
var err error
398435

399-
if g.mode == STD || g.mode == BOTH {
400-
if _, ok := g.colors[level]; ok && g.isColor {
436+
if g.mode[level] == STD || g.mode[level] == BOTH {
437+
_, ok := g.colors[level]
438+
if g.isColor[level] && ok {
401439
g.mu.Lock()
402440
_, err = fmt.Fprintf(g.std[level], g.colors[level](str)+"\n", val...)
403441
g.mu.Unlock()
@@ -411,7 +449,7 @@ func (g *Glg) out(level, format string, val ...interface{}) error {
411449
}
412450
}
413451

414-
if g.mode == WRITER || g.mode == BOTH {
452+
if g.mode[level] == WRITER || g.mode[level] == BOTH {
415453
g.mu.Lock()
416454
w, ok := g.writer[level]
417455
g.mu.Unlock()

glg_test.go

+74-20
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,8 @@ func TestNew(t *testing.T) {
4747
t.Run("Comparing simple instances", func(t *testing.T) {
4848
ins1 := New()
4949
ins2 := New()
50-
if ins1.GetCurrentMode() != ins2.GetCurrentMode() {
51-
t.Errorf("glg mode = %v, want %v", ins1.GetCurrentMode(), ins2.GetCurrentMode())
50+
if ins1.GetCurrentMode(LOG) != ins2.GetCurrentMode(LOG) {
51+
t.Errorf("glg mode = %v, want %v", ins1.GetCurrentMode(LOG), ins2.GetCurrentMode(LOG))
5252
}
5353

5454
for k, v := range ins1.writer {
@@ -95,8 +95,8 @@ func TestGet(t *testing.T) {
9595
t.Errorf("Expect %v, want %v", ins2, ins1)
9696
}
9797

98-
if ins1.GetCurrentMode() != ins2.GetCurrentMode() {
99-
t.Errorf("glg mode = %v, want %v", ins1.GetCurrentMode(), ins2.GetCurrentMode())
98+
if ins1.GetCurrentMode(LOG) != ins2.GetCurrentMode(LOG) {
99+
t.Errorf("glg mode = %v, want %v", ins1.GetCurrentMode(LOG), ins2.GetCurrentMode(LOG))
100100
}
101101

102102
for k, v := range ins1.writer {
@@ -181,7 +181,61 @@ func TestGlg_SetMode(t *testing.T) {
181181
g := New()
182182
for _, tt := range tests {
183183
t.Run(tt.name, func(t *testing.T) {
184-
if got := g.SetMode(tt.mode).GetCurrentMode(); !reflect.DeepEqual(got, tt.want) && !tt.isErr {
184+
if got := g.SetMode(tt.mode).GetCurrentMode(LOG); !reflect.DeepEqual(got, tt.want) && !tt.isErr {
185+
t.Errorf("Glg.SetMode() = %v, want %v", got, tt.want)
186+
}
187+
})
188+
}
189+
}
190+
191+
func TestGlg_SetLevelMode(t *testing.T) {
192+
tests := []struct {
193+
name string
194+
mode int
195+
want int
196+
isErr bool
197+
}{
198+
{
199+
name: "std",
200+
mode: STD,
201+
want: STD,
202+
isErr: false,
203+
},
204+
{
205+
name: "writer",
206+
mode: WRITER,
207+
want: WRITER,
208+
isErr: false,
209+
},
210+
{
211+
name: "both",
212+
mode: BOTH,
213+
want: BOTH,
214+
isErr: false,
215+
},
216+
{
217+
name: "none",
218+
mode: NONE,
219+
want: NONE,
220+
isErr: false,
221+
},
222+
{
223+
name: "writer-both",
224+
mode: WRITER,
225+
want: BOTH,
226+
isErr: true,
227+
},
228+
{
229+
name: "different mode",
230+
mode: NONE,
231+
want: STD,
232+
isErr: true,
233+
},
234+
}
235+
g := New()
236+
for _, tt := range tests {
237+
t.Run(tt.name, func(t *testing.T) {
238+
if got := g.SetLevelMode(LOG, tt.mode).GetCurrentMode(LOG); !reflect.DeepEqual(got, tt.want) && !tt.isErr {
185239
t.Errorf("Glg.SetMode() = %v, want %v", got, tt.want)
186240
}
187241
})
@@ -218,8 +272,8 @@ func TestGlg_GetCurrentMode(t *testing.T) {
218272
g := New()
219273
for _, tt := range tests {
220274
t.Run(tt.name, func(t *testing.T) {
221-
if got := g.SetMode(tt.mode).GetCurrentMode(); !reflect.DeepEqual(got, tt.want) {
222-
t.Errorf("Glg.GetCurrentMode() = %v, want %v", got, tt.want)
275+
if got := g.SetMode(tt.mode).GetCurrentMode(LOG); !reflect.DeepEqual(got, tt.want) {
276+
t.Errorf("Glg.GetCurrentMode(LOG) = %v, want %v", got, tt.want)
223277
}
224278
})
225279
}
@@ -230,12 +284,12 @@ func TestGlg_InitWriter(t *testing.T) {
230284
t.Run("InitWriter Check", func(t *testing.T) {
231285
ins1 := New()
232286
ins2 := ins1.InitWriter()
233-
if ins1.GetCurrentMode() != ins2.GetCurrentMode() {
234-
t.Errorf("glg mode = %v, want %v", ins1.GetCurrentMode(), ins2.GetCurrentMode())
287+
if ins1.GetCurrentMode(LOG) != ins2.GetCurrentMode(LOG) {
288+
t.Errorf("glg mode = %v, want %v", ins1.GetCurrentMode(LOG), ins2.GetCurrentMode(LOG))
235289
}
236290

237-
if ins2.GetCurrentMode() != STD {
238-
t.Errorf("Expect %v, want %v", ins2.GetCurrentMode(), STD)
291+
if ins2.GetCurrentMode(LOG) != STD {
292+
t.Errorf("Expect %v, want %v", ins2.GetCurrentMode(LOG), STD)
239293
}
240294

241295
for k, v := range ins1.writer {
@@ -515,7 +569,7 @@ func TestGlg_AddStdLevel(t *testing.T) {
515569
for _, tt := range tests {
516570
t.Run(tt.name, func(t *testing.T) {
517571
g := New()
518-
g.AddStdLevel(tt.level)
572+
g.AddStdLevel(tt.level, STD, false)
519573
got, ok := g.std[tt.level]
520574
if !ok || !reflect.DeepEqual(got, tt.want) {
521575
t.Errorf("Glg.AddStdLevel() = %v, want %v", got, tt.want)
@@ -544,7 +598,7 @@ func TestGlg_AddErrLevel(t *testing.T) {
544598
for _, tt := range tests {
545599
t.Run(tt.name, func(t *testing.T) {
546600
g := New()
547-
g.AddErrLevel(tt.level)
601+
g.AddErrLevel(tt.level, STD, false)
548602
got, ok := g.std[tt.level]
549603
if !ok || !reflect.DeepEqual(got, tt.want) {
550604
t.Errorf("Glg.AddErrLevel() = %v, want %v", got, tt.want)
@@ -567,7 +621,7 @@ func TestGlg_EnableColor(t *testing.T) {
567621
}
568622
for _, tt := range tests {
569623
t.Run(tt.name, func(t *testing.T) {
570-
got := tt.glg.EnableColor().isColor
624+
got := tt.glg.EnableColor().isColor[LOG]
571625
if !reflect.DeepEqual(got, tt.want) {
572626
t.Errorf("Glg.EnableColor() = %v, want %v", got, tt.want)
573627
}
@@ -589,7 +643,7 @@ func TestGlg_DisableColor(t *testing.T) {
589643
}
590644
for _, tt := range tests {
591645
t.Run(tt.name, func(t *testing.T) {
592-
got := tt.glg.DisableColor().isColor
646+
got := tt.glg.DisableColor().isColor[LOG]
593647
if !reflect.DeepEqual(got, tt.want) {
594648
t.Errorf("Glg.DisableColor() = %v, want %v", got, tt.want)
595649
}
@@ -1168,7 +1222,7 @@ func TestGlg_out(t *testing.T) {
11681222
g := tt.glg.SetWriter(buf)
11691223
g.out(tt.level, tt.format, tt.val...)
11701224
want := fmt.Sprintf(tt.format, tt.val...)
1171-
if !strings.Contains(buf.String(), want) && tt.glg.GetCurrentMode() != NONE && tt.glg.GetCurrentMode() != STD {
1225+
if !strings.Contains(buf.String(), want) && tt.glg.GetCurrentMode(LOG) != NONE && tt.glg.GetCurrentMode(LOG) != STD {
11721226
t.Errorf("Glg.out() = got %v want %v", buf.String(), want)
11731227
}
11741228
})
@@ -1823,7 +1877,7 @@ func TestGlg_CustomLog(t *testing.T) {
18231877
for _, tt := range tests {
18241878
t.Run(tt.name, func(t *testing.T) {
18251879
buf := new(bytes.Buffer)
1826-
g := New().SetMode(WRITER).AddStdLevel(tt.level).SetWriter(buf)
1880+
g := New().SetMode(WRITER).AddStdLevel(tt.level, WRITER, false).SetWriter(buf)
18271881
g.CustomLog(tt.level, tt.val...)
18281882
want := fmt.Sprintf("%v", tt.val...)
18291883
if !strings.Contains(buf.String(), want) {
@@ -1864,7 +1918,7 @@ func TestGlg_CustomLogf(t *testing.T) {
18641918
for _, tt := range tests {
18651919
t.Run(tt.name, func(t *testing.T) {
18661920
buf := new(bytes.Buffer)
1867-
g := New().SetMode(WRITER).AddStdLevel(tt.level).SetWriter(buf)
1921+
g := New().SetMode(WRITER).AddStdLevel(tt.level, WRITER, false).SetWriter(buf)
18681922
g.CustomLogf(tt.level, tt.format, tt.val...)
18691923
want := fmt.Sprintf(tt.format, tt.val...)
18701924
if !strings.Contains(buf.String(), want) {
@@ -1891,7 +1945,7 @@ func TestCustomLog(t *testing.T) {
18911945
for _, tt := range tests {
18921946
t.Run(tt.name, func(t *testing.T) {
18931947
buf := new(bytes.Buffer)
1894-
Get().SetMode(WRITER).AddStdLevel(tt.level).SetWriter(buf)
1948+
Get().SetMode(WRITER).AddStdLevel(tt.level, WRITER, false).SetWriter(buf)
18951949
CustomLog(tt.level, tt.val...)
18961950
want := fmt.Sprintf("%v", tt.val...)
18971951
if !strings.Contains(buf.String(), want) {
@@ -1932,7 +1986,7 @@ func TestCustomLogf(t *testing.T) {
19321986
for _, tt := range tests {
19331987
t.Run(tt.name, func(t *testing.T) {
19341988
buf := new(bytes.Buffer)
1935-
Get().SetMode(WRITER).AddStdLevel(tt.level).SetWriter(buf)
1989+
Get().SetMode(WRITER).AddStdLevel(tt.level, WRITER, false).SetWriter(buf)
19361990
CustomLogf(tt.level, tt.format, tt.val...)
19371991
want := fmt.Sprintf(tt.format, tt.val...)
19381992
if !strings.Contains(buf.String(), want) {

0 commit comments

Comments
 (0)