[Race] Fix datarace in GetLevel `std.Level` is protected by mutex in setter (SetLevel), so it must be protected in geetter (GetLevel) too. Signed-off-by: Anton Tiurin <noxiouz@yandex.ru>
diff --git a/exported.go b/exported.go index fd092fc..a67e1b8 100644 --- a/exported.go +++ b/exported.go
@@ -36,6 +36,8 @@ // GetLevel returns the standard logger level. func GetLevel() Level { + std.mu.Lock() + defer std.mu.Unlock() return std.Level }
diff --git a/logrus_test.go b/logrus_test.go index 7f52c6f..d85dba4 100644 --- a/logrus_test.go +++ b/logrus_test.go
@@ -5,6 +5,7 @@ "encoding/json" "strconv" "strings" + "sync" "testing" "github.com/stretchr/testify/assert" @@ -281,3 +282,20 @@ l, err = ParseLevel("invalid") assert.Equal(t, "not a valid logrus Level: \"invalid\"", err.Error()) } + +func TestGetSetLevelRace(t *testing.T) { + wg := sync.WaitGroup{} + for i := 0; i < 100; i++ { + wg.Add(1) + go func(i int) { + defer wg.Done() + if i%2 == 0 { + SetLevel(InfoLevel) + } else { + GetLevel() + } + }(i) + + } + wg.Wait() +}