diff --git a/level.go b/level.go index 98dd191..5123f8e 100644 --- a/level.go +++ b/level.go @@ -66,6 +66,7 @@ type LeveledBackend interface { } type moduleLeveled struct { + sync.RWMutex levels map[string]Level backend Backend formatter Formatter @@ -88,6 +89,8 @@ func AddModuleLevel(backend Backend) LeveledBackend { // GetLevel returns the log level for the given module. func (l *moduleLeveled) GetLevel(module string) Level { + l.RLock() + defer l.RUnlock() level, exists := l.levels[module] if exists == false { level, exists = l.levels[""] @@ -101,6 +104,8 @@ func (l *moduleLeveled) GetLevel(module string) Level { // SetLevel sets the log level for the given module. func (l *moduleLeveled) SetLevel(level Level, module string) { + l.Lock() + defer l.Unlock() l.levels[module] = level } diff --git a/logger_test.go b/logger_test.go index b9f7fe7..470e39b 100644 --- a/logger_test.go +++ b/logger_test.go @@ -60,3 +60,17 @@ func TestPrivateBackend(t *testing.T) { t.Error("logged to defaultBackend:", MemoryRecordN(privateBackend, 0)) } } + +func TestConcurrency(t *testing.T) { + logger := MustGetLogger("test") + go func() { + for i := 0; i < 1000; i++ { + SetLevel(Level(DEBUG), "test") + } + }() + + for i := 0; i < 1000; i++ { + logger.Info("") + } +} +