From 7386306bcf697928e9e8fffd34776a7e339f4cd7 Mon Sep 17 00:00:00 2001 From: clchen Date: Fri, 12 Aug 2016 17:31:39 +0800 Subject: [PATCH] fix backend data race --- backend.go | 16 +++++++++++----- logger.go | 4 ++-- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/backend.go b/backend.go index 74d9201..6c34e25 100644 --- a/backend.go +++ b/backend.go @@ -4,8 +4,12 @@ package logging +import ( + "sync/atomic" +) + // defaultBackend is the backend used for all logging calls. -var defaultBackend LeveledBackend +var defaultBackend atomic.Value // Backend is the interface which a log backend need to implement to be able to // be used as a logging backend. @@ -23,17 +27,19 @@ func SetBackend(backends ...Backend) LeveledBackend { backend = MultiLogger(backends...) } - defaultBackend = AddModuleLevel(backend) - return defaultBackend + newDefaultBackend := AddModuleLevel(backend) + defaultBackend.Store(&newDefaultBackend) + + return *defaultBackend.Load().(*LeveledBackend) } // SetLevel sets the logging level for the specified module. The module // corresponds to the string specified in GetLogger. func SetLevel(level Level, module string) { - defaultBackend.SetLevel(level, module) + (*defaultBackend.Load().(*LeveledBackend)).SetLevel(level, module) } // GetLevel returns the logging level for the specified module. func GetLevel(module string) Level { - return defaultBackend.GetLevel(module) + return (*defaultBackend.Load().(*LeveledBackend)).GetLevel(module) } diff --git a/logger.go b/logger.go index 535ed9b..9f24739 100644 --- a/logger.go +++ b/logger.go @@ -137,7 +137,7 @@ func Reset() { // IsEnabledFor returns true if the logger is enabled for the given level. func (l *Logger) IsEnabledFor(level Level) bool { - return defaultBackend.IsEnabledFor(level, l.Module) + return (*defaultBackend.Load().(*LeveledBackend)).IsEnabledFor(level, l.Module) } func (l *Logger) log(lvl Level, format *string, args ...interface{}) { @@ -167,7 +167,7 @@ func (l *Logger) log(lvl Level, format *string, args ...interface{}) { return } - defaultBackend.Log(lvl, 2+l.ExtraCalldepth, record) + (*defaultBackend.Load().(*LeveledBackend)).Log(lvl, 2+l.ExtraCalldepth, record) } // Fatal is equivalent to l.Critical(fmt.Sprint()) followed by a call to os.Exit(1).