Revert the change introduced in #707 and do the proper fix. Fixes #729

This commit is contained in:
Moriyoshi Koizumi 2018-05-30 09:50:59 +00:00
parent ea8897e799
commit 070c81def3
2 changed files with 8 additions and 13 deletions

View File

@ -113,12 +113,10 @@ func (entry Entry) log(level Level, msg string) {
} }
} }
// This function is not declared with a pointer value because otherwise func (entry *Entry) fireHooks() {
// race conditions will occur when using multiple goroutines
func (entry Entry) fireHooks() {
entry.Logger.mu.Lock() entry.Logger.mu.Lock()
defer entry.Logger.mu.Unlock() defer entry.Logger.mu.Unlock()
err := entry.Logger.Hooks.Fire(entry.Level, &entry) err := entry.Logger.Hooks.Fire(entry.Level, entry)
if err != nil { if err != nil {
fmt.Fprintf(os.Stderr, "Failed to fire hook: %v\n", err) fmt.Fprintf(os.Stderr, "Failed to fire hook: %v\n", err)
} }

View File

@ -15,7 +15,7 @@ type Hook struct {
// Entries is an array of all entries that have been received by this hook. // Entries is an array of all entries that have been received by this hook.
// For safe access, use the AllEntries() method, rather than reading this // For safe access, use the AllEntries() method, rather than reading this
// value directly. // value directly.
Entries []*logrus.Entry Entries []logrus.Entry
mu sync.RWMutex mu sync.RWMutex
} }
@ -52,7 +52,7 @@ func NewNullLogger() (*logrus.Logger, *Hook) {
func (t *Hook) Fire(e *logrus.Entry) error { func (t *Hook) Fire(e *logrus.Entry) error {
t.mu.Lock() t.mu.Lock()
defer t.mu.Unlock() defer t.mu.Unlock()
t.Entries = append(t.Entries, e) t.Entries = append(t.Entries, *e)
return nil return nil
} }
@ -68,9 +68,7 @@ func (t *Hook) LastEntry() *logrus.Entry {
if i < 0 { if i < 0 {
return nil return nil
} }
// Make a copy, for safety return &t.Entries[i]
e := *t.Entries[i]
return &e
} }
// AllEntries returns all entries that were logged. // AllEntries returns all entries that were logged.
@ -79,10 +77,9 @@ func (t *Hook) AllEntries() []*logrus.Entry {
defer t.mu.RUnlock() defer t.mu.RUnlock()
// Make a copy so the returned value won't race with future log requests // Make a copy so the returned value won't race with future log requests
entries := make([]*logrus.Entry, len(t.Entries)) entries := make([]*logrus.Entry, len(t.Entries))
for i, entry := range t.Entries { for i := 0; i < len(t.Entries); i++ {
// Make a copy, for safety // Make a copy, for safety
e := *entry entries[i] = &t.Entries[i]
entries[i] = &e
} }
return entries return entries
} }
@ -91,5 +88,5 @@ func (t *Hook) AllEntries() []*logrus.Entry {
func (t *Hook) Reset() { func (t *Hook) Reset() {
t.mu.Lock() t.mu.Lock()
defer t.mu.Unlock() defer t.mu.Unlock()
t.Entries = make([]*logrus.Entry, 0) t.Entries = make([]logrus.Entry, 0)
} }