diff --git a/entry.go b/entry.go index c968f63..07a1e5f 100644 --- a/entry.go +++ b/entry.go @@ -261,7 +261,15 @@ func (entry *Entry) log(level Level, msg string) { } func (entry *Entry) fireHooks() { - err := entry.Logger.Hooks.Fire(entry.Level, entry) + var tmpHooks LevelHooks + entry.Logger.mu.Lock() + tmpHooks = make(LevelHooks, len(entry.Logger.Hooks)) + for k, v := range entry.Logger.Hooks { + tmpHooks[k] = v + } + entry.Logger.mu.Unlock() + + err := tmpHooks.Fire(entry.Level, entry) if err != nil { fmt.Fprintf(os.Stderr, "Failed to fire hook: %v\n", err) } diff --git a/hook_test.go b/hook_test.go index b5cf077..a2becc8 100644 --- a/hook_test.go +++ b/hook_test.go @@ -3,6 +3,7 @@ package logrus_test import ( "bytes" "encoding/json" + "fmt" "sync" "testing" @@ -10,6 +11,7 @@ import ( "github.com/stretchr/testify/require" . "github.com/sirupsen/logrus" + "github.com/sirupsen/logrus/hooks/test" . "github.com/sirupsen/logrus/internal/testutils" ) @@ -191,6 +193,20 @@ func TestAddHookRace(t *testing.T) { }) } +func TestAddHookRace2(t *testing.T) { + t.Parallel() + + for i := 0; i < 3; i++ { + testname := fmt.Sprintf("Test %d", i) + t.Run(testname, func(t *testing.T) { + t.Parallel() + + _ = test.NewGlobal() + Info(testname) + }) + } +} + type HookCallFunc struct { F func() }