From fb76377a3e951f5d866e3e25b2f986f00b27a5b4 Mon Sep 17 00:00:00 2001 From: Stone-afk <73482944+Stone-afk@users.noreply.github.com> Date: Fri, 20 Jan 2023 13:49:03 +0800 Subject: [PATCH] rft: motify BeeLogger signalChan (#5139) --- CHANGELOG.md | 1 + core/logs/console_test.go | 2 ++ core/logs/log.go | 29 ++++++++++++++++------------- 3 files changed, 19 insertions(+), 13 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 94ec3687..c087e317 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ - [Fix 5129: must set formatter after init the logger](https://github.com/beego/beego/pull/5130) - [Fix 5079: only log msg when the channel is not closed](https://github.com/beego/beego/pull/5132) - [Fix 4435: Controller SaveToFile remove all temp file](https://github.com/beego/beego/pull/5138) +- [Fix 5079: Split signalChan into flushChan and closeChan](https://github.com/beego/beego/pull/5139) # v2.0.7 - [Upgrade github.com/go-kit/kit, CVE-2022-24450](https://github.com/beego/beego/pull/5121) diff --git a/core/logs/console_test.go b/core/logs/console_test.go index 3ba932ab..2f2be0ea 100644 --- a/core/logs/console_test.go +++ b/core/logs/console_test.go @@ -63,6 +63,8 @@ func TestConsoleAsync(t *testing.T) { for len(log.msgChan) != 0 { time.Sleep(1 * time.Millisecond) } + log.Flush() + log.Close() } func TestFormat(t *testing.T) { diff --git a/core/logs/log.go b/core/logs/log.go index 5abdae7e..7d36d117 100644 --- a/core/logs/log.go +++ b/core/logs/log.go @@ -121,7 +121,8 @@ type BeeLogger struct { prefix string msgChanLen int64 msgChan chan *LogMsg - signalChan chan string + closeChan chan struct{} + flushChan chan struct{} outputs []*nameLogger globalFormatter string } @@ -146,7 +147,8 @@ func NewLogger(channelLens ...int64) *BeeLogger { if bl.msgChanLen <= 0 { bl.msgChanLen = defaultAsyncMsgLen } - bl.signalChan = make(chan string, 1) + bl.flushChan = make(chan struct{}, 1) + bl.closeChan = make(chan struct{}, 1) bl.setLogger(AdapterConsole) return bl } @@ -366,16 +368,16 @@ func (bl *BeeLogger) startLogger() { bl.writeToLoggers(bm) logMsgPool.Put(bm) } - case sg := <-bl.signalChan: - // Now should only send "flush" or "close" to bl.signalChan + case <-bl.closeChan: bl.flush() - if sg == "close" { - for _, l := range bl.outputs { - l.Destroy() - } - bl.outputs = nil - gameOver = true + for _, l := range bl.outputs { + l.Destroy() } + bl.outputs = nil + gameOver = true + bl.wg.Done() + case <-bl.flushChan: + bl.flush() bl.wg.Done() } if gameOver { @@ -569,7 +571,7 @@ func (bl *BeeLogger) Trace(format string, v ...interface{}) { // Flush flush all chan data. func (bl *BeeLogger) Flush() { if bl.asynchronous { - bl.signalChan <- "flush" + bl.flushChan <- struct{}{} bl.wg.Wait() bl.wg.Add(1) return @@ -580,7 +582,7 @@ func (bl *BeeLogger) Flush() { // Close close logger, flush all chan data and destroy all adapters in BeeLogger. func (bl *BeeLogger) Close() { if bl.asynchronous { - bl.signalChan <- "close" + bl.closeChan <- struct{}{} bl.wg.Wait() close(bl.msgChan) } else { @@ -590,7 +592,8 @@ func (bl *BeeLogger) Close() { } bl.outputs = nil } - close(bl.signalChan) + close(bl.flushChan) + close(bl.closeChan) } // Reset close all outputs, and set bl.outputs to nil