From e6116fd8f00d34b10238bec1e3e4de5c80a8befc Mon Sep 17 00:00:00 2001 From: yml2213 Date: Thu, 25 Jun 2026 17:41:50 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=97=A5=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/logger/logger.go | 36 ++++++++++++++++++++++++++++++------ 1 file changed, 30 insertions(+), 6 deletions(-) diff --git a/internal/logger/logger.go b/internal/logger/logger.go index 833f3cd..1495152 100644 --- a/internal/logger/logger.go +++ b/internal/logger/logger.go @@ -100,7 +100,29 @@ func (w *AsyncLogWriter) Close() error { return nil } -// InitLogging 初始化日志输出:终端、日志文件、内存缓冲三处同时写入。 +// logFileWriter 同时写入文件、内存和终端。 +// 终端写入失败时静默忽略(Windows GUI 应用无控制台)。 +type logFileWriter struct { + file *os.File + store *MemoryLogStore +} + +func (w *logFileWriter) Write(p []byte) (int, error) { + // 写入文件 + if _, err := w.file.Write(p); err != nil { + return 0, err + } + // 写入内存 + if _, err := w.store.Write(p); err != nil { + return 0, err + } + // 尝试写入终端(失败时忽略,Windows GUI 应用无控制台) + _, _ = os.Stdout.Write(p) + return len(p), nil +} + +// InitLogging 初始化日志输出:日志文件和内存缓冲同时写入。 +// 终端输出通过 logFileWriter 同步写入(Windows GUI 应用无控制台时自动跳过)。 func InitLogging(store *MemoryLogStore, logDir string) func() { if logDir == "" { logDir = constants.DefaultLogDir @@ -110,23 +132,25 @@ func InitLogging(store *MemoryLogStore, logDir string) func() { logDir = resolveAbsolutePath(logDir) if err := os.MkdirAll(logDir, 0755); err != nil { - async := NewAsyncLogWriter(io.MultiWriter(os.Stdout, store), 2048) + async := NewAsyncLogWriter(store, 2048) log.SetOutput(async) - log.Printf("日志目录创建失败,仅写入终端和内存: %v", err) + log.Printf("日志目录创建失败,仅写入内存: %v", err) return func() { _ = async.Close() } } filePath := filepath.Join(logDir, "douyu_"+time.Now().In(constants.CST).Format("20060102_150405")+".log") file, err := os.OpenFile(filePath, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644) if err != nil { - async := NewAsyncLogWriter(io.MultiWriter(os.Stdout, store), 2048) + async := NewAsyncLogWriter(store, 2048) log.SetOutput(async) - log.Printf("日志文件创建失败,仅写入终端和内存: %v", err) + log.Printf("日志文件创建失败,仅写入内存: %v", err) return func() { _ = async.Close() } } store.SetFilePath(filePath) - async := NewAsyncLogWriter(io.MultiWriter(os.Stdout, file, store), 2048) + // 使用 logFileWriter 同时写入文件、内存和终端(终端失败时静默忽略) + multi := &logFileWriter{file: file, store: store} + async := NewAsyncLogWriter(multi, 2048) log.SetOutput(async) log.Printf("日志文件已启用: %s", filePath) return func() {