Explorar o código

Fixed locking

Signed-off-by: Vishal Rana <vr@labstack.com>
Vishal Rana %!s(int64=6) %!d(string=hai) anos
pai
achega
41215b3ce6
Modificáronse 2 ficheiros con 24 adicións e 21 borrados
  1. 4 0
      go.sum
  2. 20 21
      log/log.go

+ 4 - 0
go.sum

@@ -3,9 +3,11 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c
 github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 github.com/mattn/go-colorable v0.0.9 h1:UVL0vNpWh04HeJXV0KLcaT7r06gOH2l4OW6ddYRUIY4=
 github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
+github.com/mattn/go-colorable v0.1.2 h1:/bC9yWikZXAL9uJdulbSfyVNIR3n3trXl+v8+1sx8mU=
 github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
 github.com/mattn/go-isatty v0.0.4 h1:bnP0vzxcAdeI1zdubAl5PjU6zsERjGZb7raWodagDYs=
 github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
+github.com/mattn/go-isatty v0.0.8 h1:HLtExJ+uU2HOZ+wI0Tt5DtUDrx8yhUqDcp7fYERX4CE=
 github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
 github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
 github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
@@ -13,11 +15,13 @@ github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+
 github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
 github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w=
 github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
+github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q=
 github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
 github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw=
 github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc=
 github.com/valyala/fasttemplate v0.0.0-20170224212429-dcecefd839c4 h1:gKMu1Bf6QINDnvyZuTaACm9ofY+PRh+5vFz4oxBZeF8=
 github.com/valyala/fasttemplate v0.0.0-20170224212429-dcecefd839c4/go.mod h1:50wTf68f99/Zt14pr046Tgt3Lp2vLyFZKzbFXTOabXw=
+github.com/valyala/fasttemplate v1.0.1 h1:tY9CJiPnMXf1ERmG2EyK7gNUd+c6RKGD0IfU8WdUSz8=
 github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8=
 golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20190531175056-4c3a928424d2 h1:T5DasATyLQfmbTpfEXx/IOL9vfjzW6up+ZDkmHvIf2s=

+ 20 - 21
log/log.go

@@ -10,6 +10,7 @@ import (
 	"runtime"
 	"strconv"
 	"sync"
+	"sync/atomic"
 	"time"
 
 	"github.com/mattn/go-isatty"
@@ -21,7 +22,7 @@ import (
 type (
 	Logger struct {
 		prefix     string
-		level      Lvl
+		level      uint32
 		skip       int
 		output     io.Writer
 		template   *fasttemplate.Template
@@ -31,13 +32,11 @@ type (
 		mutex      sync.Mutex
 	}
 
-	Lvl uint8
-
 	JSON map[string]interface{}
 )
 
 const (
-	DEBUG Lvl = iota + 1
+	DEBUG uint32 = iota + 1
 	INFO
 	WARN
 	ERROR
@@ -109,12 +108,12 @@ func (l *Logger) SetPrefix(p string) {
 	l.prefix = p
 }
 
-func (l *Logger) Level() Lvl {
-	return l.level
+func (l *Logger) Level() uint32 {
+	return atomic.LoadUint32(&l.level)
 }
 
-func (l *Logger) SetLevel(v Lvl) {
-	l.level = v
+func (l *Logger) SetLevel(level uint32) {
+	atomic.StoreUint32(&l.level, level)
 }
 
 func (l *Logger) Output() io.Writer {
@@ -243,12 +242,12 @@ func SetPrefix(p string) {
 	global.SetPrefix(p)
 }
 
-func Level() Lvl {
+func Level() uint32 {
 	return global.Level()
 }
 
-func SetLevel(v Lvl) {
-	global.SetLevel(v)
+func SetLevel(level uint32) {
+	global.SetLevel(level)
 }
 
 func Output() io.Writer {
@@ -347,16 +346,14 @@ func Panicj(j JSON) {
 	global.Panicj(j)
 }
 
-func (l *Logger) log(v Lvl, format string, args ...interface{}) {
-	l.mutex.Lock()
-	defer l.mutex.Unlock()
-	buf := l.bufferPool.Get().(*bytes.Buffer)
-	buf.Reset()
-	defer l.bufferPool.Put(buf)
-	_, file, line, _ := runtime.Caller(l.skip)
-
-	if v >= l.level || v == 0 {
+func (l *Logger) log(level uint32, format string, args ...interface{}) {
+	if level >= l.level || level == 0 {
+		buf := l.bufferPool.Get().(*bytes.Buffer)
+		buf.Reset()
+		defer l.bufferPool.Put(buf)
+		_, file, line, _ := runtime.Caller(l.skip)
 		message := ""
+
 		if format == "" {
 			message = fmt.Sprint(args...)
 		} else if format == "json" {
@@ -376,7 +373,7 @@ func (l *Logger) log(v Lvl, format string, args ...interface{}) {
 			case "time_rfc3339_nano":
 				return w.Write([]byte(time.Now().Format(time.RFC3339Nano)))
 			case "level":
-				return w.Write([]byte(l.levels[v]))
+				return w.Write([]byte(l.levels[level]))
 			case "prefix":
 				return w.Write([]byte(l.prefix))
 			case "long_file":
@@ -409,6 +406,8 @@ func (l *Logger) log(v Lvl, format string, args ...interface{}) {
 				buf.WriteString(message)
 			}
 			buf.WriteByte('\n')
+			l.mutex.Lock()
+			defer l.mutex.Unlock()
 			l.output.Write(buf.Bytes())
 		}
 	}