diff options
author | zeripath | 2022-06-18 03:33:13 +0100 |
---|---|---|
committer | GitHub | 2022-06-18 10:33:13 +0800 |
commit | 8eefe2af45f55f470e427ad30eb1aa316ec8cb73 (patch) | |
tree | 004611cd0d31aa98c264548119d70e50f0292d0b | |
parent | 46e50bcbfcce11c7efa36988eff41c28ffdd5e4d (diff) |
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 <art27@cantab.net>
* and do similar for ChannelledLog
Signed-off-by: Andrew Thornton <art27@cantab.net>
Co-authored-by: Lunny Xiao <xiaolunwen@gmail.com>
-rw-r--r-- | modules/log/event.go | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/modules/log/event.go b/modules/log/event.go index f66ecd179..41bb241da 100644 --- a/modules/log/event.go +++ b/modules/log/event.go @@ -89,8 +89,10 @@ func (l *ChannelledLog) Start() { l.closeLogger() return } + l.emptyQueue() l.loggerProvider.Flush() case <-l.close: + l.emptyQueue() l.closeLogger() return } @@ -111,6 +113,20 @@ func (l *ChannelledLog) LogEvent(event *Event) error { } } +func (l *ChannelledLog) emptyQueue() bool { + for { + select { + case event, ok := <-l.queue: + if !ok { + return false + } + l.loggerProvider.LogEvent(event) + default: + return true + } + } +} + func (l *ChannelledLog) closeLogger() { l.loggerProvider.Flush() l.loggerProvider.Close() @@ -345,18 +361,41 @@ func (m *MultiChannelledLog) Start() { m.closeLoggers() return } + m.emptyQueue() m.rwmutex.RLock() for _, logger := range m.loggers { logger.Flush() } m.rwmutex.RUnlock() case <-m.close: + m.emptyQueue() m.closeLoggers() return } } } +func (m *MultiChannelledLog) emptyQueue() bool { + for { + select { + case event, ok := <-m.queue: + if !ok { + return false + } + m.rwmutex.RLock() + for _, logger := range m.loggers { + err := logger.LogEvent(event) + if err != nil { + fmt.Println(err) + } + } + m.rwmutex.RUnlock() + default: + return true + } + } +} + // LogEvent logs an event to this MultiChannelledLog func (m *MultiChannelledLog) LogEvent(event *Event) error { select { |