package log
import (
"context"
"fmt"
"io"
"log"
"os"
"sync"
"github.com/valyala/bytebufferpool"
)
var _ AllLogger = (*defaultLogger )(nil )
type defaultLogger struct {
stdlog *log .Logger
level Level
depth int
}
func (l *defaultLogger ) privateLog (lv Level , fmtArgs []interface {}) {
if l .level > lv {
return
}
level := lv .toString ()
buf := bytebufferpool .Get ()
_, _ = buf .WriteString (level )
_, _ = buf .WriteString (fmt .Sprint (fmtArgs ...))
_ = l .stdlog .Output (l .depth , buf .String ())
buf .Reset ()
bytebufferpool .Put (buf )
if lv == LevelFatal {
os .Exit (1 )
}
}
func (l *defaultLogger ) privateLogf (lv Level , format string , fmtArgs []interface {}) {
if l .level > lv {
return
}
level := lv .toString ()
buf := bytebufferpool .Get ()
_, _ = buf .WriteString (level )
if len (fmtArgs ) > 0 {
_, _ = fmt .Fprintf (buf , format , fmtArgs ...)
} else {
_, _ = fmt .Fprint (buf , fmtArgs ...)
}
_ = l .stdlog .Output (l .depth , buf .String ())
buf .Reset ()
bytebufferpool .Put (buf )
if lv == LevelFatal {
os .Exit (1 )
}
}
func (l *defaultLogger ) privateLogw (lv Level , format string , keysAndValues []interface {}) {
if l .level > lv {
return
}
level := lv .toString ()
buf := bytebufferpool .Get ()
_, _ = buf .WriteString (level )
if format != "" {
_, _ = buf .WriteString (format )
}
var once sync .Once
isFirst := true
if len (keysAndValues ) > 0 {
if (len (keysAndValues ) & 1 ) == 1 {
keysAndValues = append (keysAndValues , "KEYVALS UNPAIRED" )
}
for i := 0 ; i < len (keysAndValues ); i += 2 {
if format == "" && isFirst {
once .Do (func () {
_, _ = fmt .Fprintf (buf , "%s=%v" , keysAndValues [i ], keysAndValues [i +1 ])
isFirst = false
})
continue
}
_, _ = fmt .Fprintf (buf , " %s=%v" , keysAndValues [i ], keysAndValues [i +1 ])
}
}
_ = l .stdlog .Output (l .depth , buf .String ())
buf .Reset ()
bytebufferpool .Put (buf )
if lv == LevelFatal {
os .Exit (1 )
}
}
func (l *defaultLogger ) Trace (v ...interface {}) {
l .privateLog (LevelTrace , v )
}
func (l *defaultLogger ) Debug (v ...interface {}) {
l .privateLog (LevelDebug , v )
}
func (l *defaultLogger ) Info (v ...interface {}) {
l .privateLog (LevelInfo , v )
}
func (l *defaultLogger ) Warn (v ...interface {}) {
l .privateLog (LevelWarn , v )
}
func (l *defaultLogger ) Error (v ...interface {}) {
l .privateLog (LevelError , v )
}
func (l *defaultLogger ) Fatal (v ...interface {}) {
l .privateLog (LevelFatal , v )
}
func (l *defaultLogger ) Panic (v ...interface {}) {
l .privateLog (LevelPanic , v )
}
func (l *defaultLogger ) Tracef (format string , v ...interface {}) {
l .privateLogf (LevelTrace , format , v )
}
func (l *defaultLogger ) Debugf (format string , v ...interface {}) {
l .privateLogf (LevelDebug , format , v )
}
func (l *defaultLogger ) Infof (format string , v ...interface {}) {
l .privateLogf (LevelInfo , format , v )
}
func (l *defaultLogger ) Warnf (format string , v ...interface {}) {
l .privateLogf (LevelWarn , format , v )
}
func (l *defaultLogger ) Errorf (format string , v ...interface {}) {
l .privateLogf (LevelError , format , v )
}
func (l *defaultLogger ) Fatalf (format string , v ...interface {}) {
l .privateLogf (LevelFatal , format , v )
}
func (l *defaultLogger ) Panicf (format string , v ...interface {}) {
l .privateLogf (LevelPanic , format , v )
}
func (l *defaultLogger ) Tracew (msg string , keysAndValues ...interface {}) {
l .privateLogw (LevelTrace , msg , keysAndValues )
}
func (l *defaultLogger ) Debugw (msg string , keysAndValues ...interface {}) {
l .privateLogw (LevelDebug , msg , keysAndValues )
}
func (l *defaultLogger ) Infow (msg string , keysAndValues ...interface {}) {
l .privateLogw (LevelInfo , msg , keysAndValues )
}
func (l *defaultLogger ) Warnw (msg string , keysAndValues ...interface {}) {
l .privateLogw (LevelWarn , msg , keysAndValues )
}
func (l *defaultLogger ) Errorw (msg string , keysAndValues ...interface {}) {
l .privateLogw (LevelError , msg , keysAndValues )
}
func (l *defaultLogger ) Fatalw (msg string , keysAndValues ...interface {}) {
l .privateLogw (LevelFatal , msg , keysAndValues )
}
func (l *defaultLogger ) Panicw (msg string , keysAndValues ...interface {}) {
l .privateLogw (LevelPanic , msg , keysAndValues )
}
func (l *defaultLogger ) WithContext (_ context .Context ) CommonLogger {
return &defaultLogger {
stdlog : l .stdlog ,
level : l .level ,
depth : l .depth - 1 ,
}
}
func (l *defaultLogger ) SetLevel (level Level ) {
l .level = level
}
func (l *defaultLogger ) SetOutput (writer io .Writer ) {
l .stdlog .SetOutput (writer )
}
func DefaultLogger () AllLogger {
return logger
}
The pages are generated with Golds v0.6.7 . (GOOS=linux GOARCH=amd64)
Golds is a Go 101 project developed by Tapir Liu .
PR and bug reports are welcome and can be submitted to the issue list .
Please follow @Go100and1 (reachable from the left QR code) to get the latest news of Golds .