@@ -10,6 +10,7 @@ import (
1010 "runtime"
1111 "strconv"
1212 "sync"
13+ "sync/atomic"
1314 "time"
1415
1516 "github.com/mattn/go-isatty"
@@ -21,7 +22,7 @@ import (
2122type (
2223 Logger struct {
2324 prefix string
24- level Lvl
25+ level uint32
2526 skip int
2627 output io.Writer
2728 template * fasttemplate.Template
@@ -31,13 +32,11 @@ type (
3132 mutex sync.Mutex
3233 }
3334
34- Lvl uint8
35-
3635 JSON map [string ]interface {}
3736)
3837
3938const (
40- DEBUG Lvl = iota + 1
39+ DEBUG uint32 = iota + 1
4140 INFO
4241 WARN
4342 ERROR
@@ -109,12 +108,12 @@ func (l *Logger) SetPrefix(p string) {
109108 l .prefix = p
110109}
111110
112- func (l * Logger ) Level () Lvl {
113- return l .level
111+ func (l * Logger ) Level () uint32 {
112+ return atomic . LoadUint32 ( & l .level )
114113}
115114
116- func (l * Logger ) SetLevel (v Lvl ) {
117- l .level = v
115+ func (l * Logger ) SetLevel (level uint32 ) {
116+ atomic . StoreUint32 ( & l .level , level )
118117}
119118
120119func (l * Logger ) Output () io.Writer {
@@ -243,12 +242,12 @@ func SetPrefix(p string) {
243242 global .SetPrefix (p )
244243}
245244
246- func Level () Lvl {
245+ func Level () uint32 {
247246 return global .Level ()
248247}
249248
250- func SetLevel (v Lvl ) {
251- global .SetLevel (v )
249+ func SetLevel (level uint32 ) {
250+ global .SetLevel (level )
252251}
253252
254253func Output () io.Writer {
@@ -347,16 +346,14 @@ func Panicj(j JSON) {
347346 global .Panicj (j )
348347}
349348
350- func (l * Logger ) log (v Lvl , format string , args ... interface {}) {
351- l .mutex .Lock ()
352- defer l .mutex .Unlock ()
353- buf := l .bufferPool .Get ().(* bytes.Buffer )
354- buf .Reset ()
355- defer l .bufferPool .Put (buf )
356- _ , file , line , _ := runtime .Caller (l .skip )
357-
358- if v >= l .level || v == 0 {
349+ func (l * Logger ) log (level uint32 , format string , args ... interface {}) {
350+ if level >= l .level || level == 0 {
351+ buf := l .bufferPool .Get ().(* bytes.Buffer )
352+ buf .Reset ()
353+ defer l .bufferPool .Put (buf )
354+ _ , file , line , _ := runtime .Caller (l .skip )
359355 message := ""
356+
360357 if format == "" {
361358 message = fmt .Sprint (args ... )
362359 } else if format == "json" {
@@ -376,7 +373,7 @@ func (l *Logger) log(v Lvl, format string, args ...interface{}) {
376373 case "time_rfc3339_nano" :
377374 return w .Write ([]byte (time .Now ().Format (time .RFC3339Nano )))
378375 case "level" :
379- return w .Write ([]byte (l .levels [v ]))
376+ return w .Write ([]byte (l .levels [level ]))
380377 case "prefix" :
381378 return w .Write ([]byte (l .prefix ))
382379 case "long_file" :
@@ -409,6 +406,8 @@ func (l *Logger) log(v Lvl, format string, args ...interface{}) {
409406 buf .WriteString (message )
410407 }
411408 buf .WriteByte ('\n' )
409+ l .mutex .Lock ()
410+ defer l .mutex .Unlock ()
412411 l .output .Write (buf .Bytes ())
413412 }
414413 }
0 commit comments