diff --git a/backend.go b/backend.go index 74d9201..a387392 100644 --- a/backend.go +++ b/backend.go @@ -4,8 +4,17 @@ package logging +import ( + "sync" +) + // defaultBackend is the backend used for all logging calls. var defaultBackend LeveledBackend +var defaultBackendMutex sync.Mutex + +func init() { + defaultBackendMutex = sync.Mutex{} +} // Backend is the interface which a log backend need to implement to be able to // be used as a logging backend. @@ -23,7 +32,9 @@ func SetBackend(backends ...Backend) LeveledBackend { backend = MultiLogger(backends...) } + defaultBackendMutex.Lock() defaultBackend = AddModuleLevel(backend) + defaultBackendMutex.Unlock() return defaultBackend } diff --git a/level.go b/level.go index 98dd191..ca2a918 100644 --- a/level.go +++ b/level.go @@ -70,6 +70,7 @@ type moduleLeveled struct { backend Backend formatter Formatter once sync.Once + mutex sync.Mutex } // AddModuleLevel wraps a log backend with knobs to have different log levels @@ -81,6 +82,7 @@ func AddModuleLevel(backend Backend) LeveledBackend { leveled = &moduleLeveled{ levels: make(map[string]Level), backend: backend, + mutex: sync.Mutex{}, } } return leveled @@ -88,6 +90,7 @@ func AddModuleLevel(backend Backend) LeveledBackend { // GetLevel returns the log level for the given module. func (l *moduleLeveled) GetLevel(module string) Level { + l.mutex.Lock() level, exists := l.levels[module] if exists == false { level, exists = l.levels[""] @@ -96,12 +99,15 @@ func (l *moduleLeveled) GetLevel(module string) Level { level = DEBUG } } + l.mutex.Unlock() return level } // SetLevel sets the log level for the given module. func (l *moduleLeveled) SetLevel(level Level, module string) { + l.mutex.Lock() l.levels[module] = level + l.mutex.Unlock() } // IsEnabledFor will return true if logging is enabled for the given module. diff --git a/logger.go b/logger.go index b430124..6bb301a 100644 --- a/logger.go +++ b/logger.go @@ -159,7 +159,9 @@ func (l *Logger) log(lvl Level, format string, args ...interface{}) { return } + defaultBackendMutex.Lock() defaultBackend.Log(lvl, 2+l.ExtraCalldepth, record) + defaultBackendMutex.Unlock() } // Fatal is equivalent to l.Critical(fmt.Sprint()) followed by a call to os.Exit(1).