瀏覽代碼

fix: avoid losing logs before closing (#3573)

xt-inking 1 年之前
父節點
當前提交
5e435b6a76
共有 2 個文件被更改,包括 30 次插入1 次删除
  1. 9 1
      core/logx/rotatelogger.go
  2. 21 0
      core/logx/rotatelogger_test.go

+ 9 - 1
core/logx/rotatelogger.go

@@ -381,7 +381,15 @@ func (l *RotateLogger) startWorker() {
 			case event := <-l.channel:
 			case event := <-l.channel:
 				l.write(event)
 				l.write(event)
 			case <-l.done:
 			case <-l.done:
-				return
+				// avoid losing logs before closing.
+				for {
+					select {
+					case event := <-l.channel:
+						l.write(event)
+					default:
+						return
+					}
+				}
 			}
 			}
 		}
 		}
 	}()
 	}()

+ 21 - 0
core/logx/rotatelogger_test.go

@@ -206,6 +206,27 @@ func TestRotateLoggerClose(t *testing.T) {
 		_, err := logger.Write([]byte("foo"))
 		_, err := logger.Write([]byte("foo"))
 		assert.ErrorIs(t, err, ErrLogFileClosed)
 		assert.ErrorIs(t, err, ErrLogFileClosed)
 	})
 	})
+
+	t.Run("close without losing logs", func(t *testing.T) {
+		text := "foo"
+		filename, err := fs.TempFilenameWithText(text)
+		assert.Nil(t, err)
+		if len(filename) > 0 {
+			defer os.Remove(filename)
+		}
+		logger, err := NewLogger(filename, new(DailyRotateRule), false)
+		assert.Nil(t, err)
+		msg := []byte("foo")
+		n := 100
+		for i := 0; i < n; i++ {
+			_, err = logger.Write(msg)
+			assert.Nil(t, err)
+		}
+		assert.Nil(t, logger.Close())
+		bs, err := os.ReadFile(filename)
+		assert.Nil(t, err)
+		assert.Equal(t, len(msg)*n+len(text), len(bs))
+	})
 }
 }
 
 
 func TestRotateLoggerGetBackupFilename(t *testing.T) {
 func TestRotateLoggerGetBackupFilename(t *testing.T) {