diff --git a/entry.go b/entry.go index 03550974..71cdbbc3 100644 --- a/entry.go +++ b/entry.go @@ -284,13 +284,13 @@ func (entry *Entry) fireHooks() { } func (entry *Entry) write() { + entry.Logger.mu.Lock() + defer entry.Logger.mu.Unlock() serialized, err := entry.Logger.Formatter.Format(entry) if err != nil { fmt.Fprintf(os.Stderr, "Failed to obtain reader, %v\n", err) return } - entry.Logger.mu.Lock() - defer entry.Logger.mu.Unlock() if _, err := entry.Logger.Out.Write(serialized); err != nil { fmt.Fprintf(os.Stderr, "Failed to write to log, %v\n", err) } diff --git a/entry_test.go b/entry_test.go index 035e4116..41c47a2f 100644 --- a/entry_test.go +++ b/entry_test.go @@ -269,6 +269,12 @@ func TestEntryLogfLevel(t *testing.T) { func TestEntryReportCallerRace(t *testing.T) { logger := New() entry := NewEntry(logger) + + // logging before SetReportCaller has the highest chance of causing a race condition + // to be detected, but doing it twice just to increase the likelyhood of detecting the race + go func() { + entry.Info("should not race") + }() go func() { logger.SetReportCaller(true) }() @@ -276,3 +282,20 @@ func TestEntryReportCallerRace(t *testing.T) { entry.Info("should not race") }() } + +func TestEntryFormatterRace(t *testing.T) { + logger := New() + entry := NewEntry(logger) + + // logging before SetReportCaller has the highest chance of causing a race condition + // to be detected, but doing it twice just to increase the likelyhood of detecting the race + go func() { + entry.Info("should not race") + }() + go func() { + logger.SetFormatter(&TextFormatter{}) + }() + go func() { + entry.Info("should not race") + }() +}