Skip to content

Commit 8eefe2a

Browse files
zeripathlunny
andauthored
Empty log queue on flush and close (#19994)
* Empty log queue on flush and close It is possible for log events to remain in the buffer off the multichannelledlog and thus not be logged despite close or flush. This PR simply adds a function to empty the queue before closing or flushing. (Except when the logger is paused.) Reference #19982 Signed-off-by: Andrew Thornton <[email protected]> * and do similar for ChannelledLog Signed-off-by: Andrew Thornton <[email protected]> Co-authored-by: Lunny Xiao <[email protected]>
1 parent 46e50bc commit 8eefe2a

File tree

1 file changed

+39
-0
lines changed

1 file changed

+39
-0
lines changed

modules/log/event.go

+39
Original file line numberDiff line numberDiff line change
@@ -89,8 +89,10 @@ func (l *ChannelledLog) Start() {
8989
l.closeLogger()
9090
return
9191
}
92+
l.emptyQueue()
9293
l.loggerProvider.Flush()
9394
case <-l.close:
95+
l.emptyQueue()
9496
l.closeLogger()
9597
return
9698
}
@@ -111,6 +113,20 @@ func (l *ChannelledLog) LogEvent(event *Event) error {
111113
}
112114
}
113115

116+
func (l *ChannelledLog) emptyQueue() bool {
117+
for {
118+
select {
119+
case event, ok := <-l.queue:
120+
if !ok {
121+
return false
122+
}
123+
l.loggerProvider.LogEvent(event)
124+
default:
125+
return true
126+
}
127+
}
128+
}
129+
114130
func (l *ChannelledLog) closeLogger() {
115131
l.loggerProvider.Flush()
116132
l.loggerProvider.Close()
@@ -345,18 +361,41 @@ func (m *MultiChannelledLog) Start() {
345361
m.closeLoggers()
346362
return
347363
}
364+
m.emptyQueue()
348365
m.rwmutex.RLock()
349366
for _, logger := range m.loggers {
350367
logger.Flush()
351368
}
352369
m.rwmutex.RUnlock()
353370
case <-m.close:
371+
m.emptyQueue()
354372
m.closeLoggers()
355373
return
356374
}
357375
}
358376
}
359377

378+
func (m *MultiChannelledLog) emptyQueue() bool {
379+
for {
380+
select {
381+
case event, ok := <-m.queue:
382+
if !ok {
383+
return false
384+
}
385+
m.rwmutex.RLock()
386+
for _, logger := range m.loggers {
387+
err := logger.LogEvent(event)
388+
if err != nil {
389+
fmt.Println(err)
390+
}
391+
}
392+
m.rwmutex.RUnlock()
393+
default:
394+
return true
395+
}
396+
}
397+
}
398+
360399
// LogEvent logs an event to this MultiChannelledLog
361400
func (m *MultiChannelledLog) LogEvent(event *Event) error {
362401
select {

0 commit comments

Comments
 (0)