aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorzeripath2022-06-18 03:33:13 +0100
committerGitHub2022-06-18 10:33:13 +0800
commit8eefe2af45f55f470e427ad30eb1aa316ec8cb73 (patch)
tree004611cd0d31aa98c264548119d70e50f0292d0b
parent46e50bcbfcce11c7efa36988eff41c28ffdd5e4d (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.go39
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 {