package logrus
import (
"context"
"io"
"os"
"sync"
"sync/atomic"
"time"
)
type LogFunction func () []interface {}
type Logger struct {
Out io .Writer
Hooks LevelHooks
Formatter Formatter
ReportCaller bool
Level Level
mu MutexWrap
entryPool sync .Pool
ExitFunc exitFunc
}
type exitFunc func (int )
type MutexWrap struct {
lock sync .Mutex
disabled bool
}
func (mw *MutexWrap ) Lock () {
if !mw .disabled {
mw .lock .Lock ()
}
}
func (mw *MutexWrap ) Unlock () {
if !mw .disabled {
mw .lock .Unlock ()
}
}
func (mw *MutexWrap ) Disable () {
mw .disabled = true
}
func New () *Logger {
return &Logger {
Out : os .Stderr ,
Formatter : new (TextFormatter ),
Hooks : make (LevelHooks ),
Level : InfoLevel ,
ExitFunc : os .Exit ,
ReportCaller : false ,
}
}
func (logger *Logger ) newEntry () *Entry {
entry , ok := logger .entryPool .Get ().(*Entry )
if ok {
return entry
}
return NewEntry (logger )
}
func (logger *Logger ) releaseEntry (entry *Entry ) {
entry .Data = map [string ]interface {}{}
logger .entryPool .Put (entry )
}
func (logger *Logger ) WithField (key string , value interface {}) *Entry {
entry := logger .newEntry ()
defer logger .releaseEntry (entry )
return entry .WithField (key , value )
}
func (logger *Logger ) WithFields (fields Fields ) *Entry {
entry := logger .newEntry ()
defer logger .releaseEntry (entry )
return entry .WithFields (fields )
}
func (logger *Logger ) WithError (err error ) *Entry {
entry := logger .newEntry ()
defer logger .releaseEntry (entry )
return entry .WithError (err )
}
func (logger *Logger ) WithContext (ctx context .Context ) *Entry {
entry := logger .newEntry ()
defer logger .releaseEntry (entry )
return entry .WithContext (ctx )
}
func (logger *Logger ) WithTime (t time .Time ) *Entry {
entry := logger .newEntry ()
defer logger .releaseEntry (entry )
return entry .WithTime (t )
}
func (logger *Logger ) Logf (level Level , format string , args ...interface {}) {
if logger .IsLevelEnabled (level ) {
entry := logger .newEntry ()
entry .Logf (level , format , args ...)
logger .releaseEntry (entry )
}
}
func (logger *Logger ) Tracef (format string , args ...interface {}) {
logger .Logf (TraceLevel , format , args ...)
}
func (logger *Logger ) Debugf (format string , args ...interface {}) {
logger .Logf (DebugLevel , format , args ...)
}
func (logger *Logger ) Infof (format string , args ...interface {}) {
logger .Logf (InfoLevel , format , args ...)
}
func (logger *Logger ) Printf (format string , args ...interface {}) {
entry := logger .newEntry ()
entry .Printf (format , args ...)
logger .releaseEntry (entry )
}
func (logger *Logger ) Warnf (format string , args ...interface {}) {
logger .Logf (WarnLevel , format , args ...)
}
func (logger *Logger ) Warningf (format string , args ...interface {}) {
logger .Warnf (format , args ...)
}
func (logger *Logger ) Errorf (format string , args ...interface {}) {
logger .Logf (ErrorLevel , format , args ...)
}
func (logger *Logger ) Fatalf (format string , args ...interface {}) {
logger .Logf (FatalLevel , format , args ...)
logger .Exit (1 )
}
func (logger *Logger ) Panicf (format string , args ...interface {}) {
logger .Logf (PanicLevel , format , args ...)
}
func (logger *Logger ) Log (level Level , args ...interface {}) {
if logger .IsLevelEnabled (level ) {
entry := logger .newEntry ()
entry .Log (level , args ...)
logger .releaseEntry (entry )
}
}
func (logger *Logger ) LogFn (level Level , fn LogFunction ) {
if logger .IsLevelEnabled (level ) {
entry := logger .newEntry ()
entry .Log (level , fn ()...)
logger .releaseEntry (entry )
}
}
func (logger *Logger ) Trace (args ...interface {}) {
logger .Log (TraceLevel , args ...)
}
func (logger *Logger ) Debug (args ...interface {}) {
logger .Log (DebugLevel , args ...)
}
func (logger *Logger ) Info (args ...interface {}) {
logger .Log (InfoLevel , args ...)
}
func (logger *Logger ) Print (args ...interface {}) {
entry := logger .newEntry ()
entry .Print (args ...)
logger .releaseEntry (entry )
}
func (logger *Logger ) Warn (args ...interface {}) {
logger .Log (WarnLevel , args ...)
}
func (logger *Logger ) Warning (args ...interface {}) {
logger .Warn (args ...)
}
func (logger *Logger ) Error (args ...interface {}) {
logger .Log (ErrorLevel , args ...)
}
func (logger *Logger ) Fatal (args ...interface {}) {
logger .Log (FatalLevel , args ...)
logger .Exit (1 )
}
func (logger *Logger ) Panic (args ...interface {}) {
logger .Log (PanicLevel , args ...)
}
func (logger *Logger ) TraceFn (fn LogFunction ) {
logger .LogFn (TraceLevel , fn )
}
func (logger *Logger ) DebugFn (fn LogFunction ) {
logger .LogFn (DebugLevel , fn )
}
func (logger *Logger ) InfoFn (fn LogFunction ) {
logger .LogFn (InfoLevel , fn )
}
func (logger *Logger ) PrintFn (fn LogFunction ) {
entry := logger .newEntry ()
entry .Print (fn ()...)
logger .releaseEntry (entry )
}
func (logger *Logger ) WarnFn (fn LogFunction ) {
logger .LogFn (WarnLevel , fn )
}
func (logger *Logger ) WarningFn (fn LogFunction ) {
logger .WarnFn (fn )
}
func (logger *Logger ) ErrorFn (fn LogFunction ) {
logger .LogFn (ErrorLevel , fn )
}
func (logger *Logger ) FatalFn (fn LogFunction ) {
logger .LogFn (FatalLevel , fn )
logger .Exit (1 )
}
func (logger *Logger ) PanicFn (fn LogFunction ) {
logger .LogFn (PanicLevel , fn )
}
func (logger *Logger ) Logln (level Level , args ...interface {}) {
if logger .IsLevelEnabled (level ) {
entry := logger .newEntry ()
entry .Logln (level , args ...)
logger .releaseEntry (entry )
}
}
func (logger *Logger ) Traceln (args ...interface {}) {
logger .Logln (TraceLevel , args ...)
}
func (logger *Logger ) Debugln (args ...interface {}) {
logger .Logln (DebugLevel , args ...)
}
func (logger *Logger ) Infoln (args ...interface {}) {
logger .Logln (InfoLevel , args ...)
}
func (logger *Logger ) Println (args ...interface {}) {
entry := logger .newEntry ()
entry .Println (args ...)
logger .releaseEntry (entry )
}
func (logger *Logger ) Warnln (args ...interface {}) {
logger .Logln (WarnLevel , args ...)
}
func (logger *Logger ) Warningln (args ...interface {}) {
logger .Warnln (args ...)
}
func (logger *Logger ) Errorln (args ...interface {}) {
logger .Logln (ErrorLevel , args ...)
}
func (logger *Logger ) Fatalln (args ...interface {}) {
logger .Logln (FatalLevel , args ...)
logger .Exit (1 )
}
func (logger *Logger ) Panicln (args ...interface {}) {
logger .Logln (PanicLevel , args ...)
}
func (logger *Logger ) Exit (code int ) {
runHandlers ()
if logger .ExitFunc == nil {
logger .ExitFunc = os .Exit
}
logger .ExitFunc (code )
}
func (logger *Logger ) SetNoLock () {
logger .mu .Disable ()
}
func (logger *Logger ) level () Level {
return Level (atomic .LoadUint32 ((*uint32 )(&logger .Level )))
}
func (logger *Logger ) SetLevel (level Level ) {
atomic .StoreUint32 ((*uint32 )(&logger .Level ), uint32 (level ))
}
func (logger *Logger ) GetLevel () Level {
return logger .level ()
}
func (logger *Logger ) AddHook (hook Hook ) {
logger .mu .Lock ()
defer logger .mu .Unlock ()
logger .Hooks .Add (hook )
}
func (logger *Logger ) IsLevelEnabled (level Level ) bool {
return logger .level () >= level
}
func (logger *Logger ) SetFormatter (formatter Formatter ) {
logger .mu .Lock ()
defer logger .mu .Unlock ()
logger .Formatter = formatter
}
func (logger *Logger ) SetOutput (output io .Writer ) {
logger .mu .Lock ()
defer logger .mu .Unlock ()
logger .Out = output
}
func (logger *Logger ) SetReportCaller (reportCaller bool ) {
logger .mu .Lock ()
defer logger .mu .Unlock ()
logger .ReportCaller = reportCaller
}
func (logger *Logger ) ReplaceHooks (hooks LevelHooks ) LevelHooks {
logger .mu .Lock ()
oldHooks := logger .Hooks
logger .Hooks = hooks
logger .mu .Unlock ()
return oldHooks
}
The pages are generated with Golds v0.3.6 . (GOOS=darwin 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 .