forked from mirror/logrus
fix race condition for SetFormatter and properly fix SetReportCaller race as well
This commit is contained in:
parent
b50299cfaa
commit
78f838918d
4
entry.go
4
entry.go
|
@ -284,13 +284,13 @@ func (entry *Entry) fireHooks() {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (entry *Entry) write() {
|
func (entry *Entry) write() {
|
||||||
|
entry.Logger.mu.Lock()
|
||||||
|
defer entry.Logger.mu.Unlock()
|
||||||
serialized, err := entry.Logger.Formatter.Format(entry)
|
serialized, err := entry.Logger.Formatter.Format(entry)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Fprintf(os.Stderr, "Failed to obtain reader, %v\n", err)
|
fmt.Fprintf(os.Stderr, "Failed to obtain reader, %v\n", err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
entry.Logger.mu.Lock()
|
|
||||||
defer entry.Logger.mu.Unlock()
|
|
||||||
if _, err := entry.Logger.Out.Write(serialized); err != nil {
|
if _, err := entry.Logger.Out.Write(serialized); err != nil {
|
||||||
fmt.Fprintf(os.Stderr, "Failed to write to log, %v\n", err)
|
fmt.Fprintf(os.Stderr, "Failed to write to log, %v\n", err)
|
||||||
}
|
}
|
||||||
|
|
|
@ -269,6 +269,12 @@ func TestEntryLogfLevel(t *testing.T) {
|
||||||
func TestEntryReportCallerRace(t *testing.T) {
|
func TestEntryReportCallerRace(t *testing.T) {
|
||||||
logger := New()
|
logger := New()
|
||||||
entry := NewEntry(logger)
|
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() {
|
go func() {
|
||||||
logger.SetReportCaller(true)
|
logger.SetReportCaller(true)
|
||||||
}()
|
}()
|
||||||
|
@ -276,3 +282,20 @@ func TestEntryReportCallerRace(t *testing.T) {
|
||||||
entry.Info("should not race")
|
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")
|
||||||
|
}()
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue