From 5a37aea56f4bc1ea000e85ffbb2dd0f11d5992a2 Mon Sep 17 00:00:00 2001 From: black1552 Date: Fri, 6 Mar 2026 10:20:55 +0800 Subject: [PATCH] =?UTF-8?q?feat(log):=20=E5=AE=9E=E7=8E=B0=E6=97=A5?= =?UTF-8?q?=E5=BF=97=E7=B3=BB=E7=BB=9F=E5=BD=A9=E8=89=B2=E8=BE=93=E5=87=BA?= =?UTF-8?q?=E5=92=8C=E6=96=87=E4=BB=B6=E5=88=86=E7=A6=BB=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 添加 ANSI 颜色常量定义支持彩色输出 - 实现 stripAnsiColors 函数去除 ANSI 颜色码 - 创建 logWriter 结构体实现控制台带颜色文件无颜色的输出 - 修改初始化逻辑使用自定义 writer 替代 MultiWriter - 更新 Info、Error、Warn、Debug 函数添加时间戳和颜色前缀 - 将日志文件大小限制从 1MB 调整为 2MB - 移除默认日志标志位,使用自定义格式化输出 --- log/log.go | 67 ++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 52 insertions(+), 15 deletions(-) diff --git a/log/log.go b/log/log.go index d937ac7..d868db0 100644 --- a/log/log.go +++ b/log/log.go @@ -5,8 +5,10 @@ import ( "io" "log" "os" + "regexp" "runtime/debug" "strings" + "time" "github.com/gogf/gf/v2/os/gfile" "github.com/gogf/gf/v2/os/gtime" @@ -18,42 +20,77 @@ var ( sysLog *log.Logger ) +const ( + Reset = "\033[0m" + Red = "\033[31m" + Green = "\033[32m" + Yellow = "\033[33m" + Blue = "\033[34m" + Purple = "\033[35m" + Cyan = "\033[36m" +) + +// 正则表达式匹配 ANSI 颜色码 +var ansiColorRegex = regexp.MustCompile(`\x1b\[[0-9;]*m`) + +// stripAnsiColors 去除字符串中的 ANSI 颜色码 +func stripAnsiColors(s string) string { + return ansiColorRegex.ReplaceAllString(s, "") +} + +// logWriter 自定义 writer,用于分别处理控制台和文件输出 +type logWriter struct { + console io.Writer + file io.Writer +} + +func (w *logWriter) Write(p []byte) (n int, err error) { + // 控制台输出保留颜色 + _, err = w.console.Write(p) + if err != nil { + return 0, err + } + // 文件输出去除颜色码 + colorless := stripAnsiColors(string(p)) + _, err = w.file.Write([]byte(colorless)) + if err != nil { + return 0, err + } + return len(p), nil +} + func init() { logPath = gfile.Join(gfile.Pwd(), "logs") filePath := gfile.Join(logPath, fmt.Sprintf("log-%s.log", gtime.Date())) fileLogger := &lumberjack.Logger{ Filename: filePath, - MaxSize: 1, // 单个文件最大 10MB + MaxSize: 2, // 单个文件最大 10MB MaxBackups: 5, // 最多保留 5 个备份 MaxAge: 30, // 保留 30 天 Compress: false, // 启用压缩 } - // 创建 MultiWriter 实现同时输出到文件和终端 - multiWriter := io.MultiWriter(fileLogger, os.Stdout) - sysLog = log.New(multiWriter, "", log.LstdFlags) + // 使用自定义 writer 实现控制台带颜色、文件无颜色的输出 + multiWriter := &logWriter{ + console: os.Stdout, + file: fileLogger, + } + sysLog = log.New(multiWriter, "", 0) } -// Info 打印普通信息日志 func Info(v ...any) { - sysLog.SetPrefix("[INFO] ") + sysLog.SetPrefix(fmt.Sprintf("[%s] %s[INFO]%s ", time.Now().Format("2006-01-02 15:04:05"), Green, Reset)) sysLog.Println(fmt.Sprint(v...)) } - -// Error 打印错误日志 func Error(v ...any) { - sysLog.SetPrefix("[ERROR] ") + sysLog.SetPrefix(fmt.Sprintf("[%s] %s[ERROR]%s ", time.Now().Format("2006-01-02 15:04:05"), Red, Reset)) msg := fmt.Sprint(v...) sysLog.Println(msg, strings.TrimSpace(string(debug.Stack()))) } - -// Warn 打印警告日志 func Warn(v ...any) { - sysLog.SetPrefix("[WARN] ") + sysLog.SetPrefix(fmt.Sprintf("[%s] %s[WARN]%s ", time.Now().Format("2006-01-02 15:04:05"), Yellow, Reset)) sysLog.Println(fmt.Sprint(v...)) } - -// Debug 打印调试日志 func Debug(v ...any) { - sysLog.SetPrefix("[DEBUG] ") + sysLog.SetPrefix(fmt.Sprintf("[%s] %s[DEBUG]%s ", time.Now().Format("2006-01-02 15:04:05"), Blue, Reset)) sysLog.Println(fmt.Sprint(v...)) }