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