feat(log): 实现带颜色的日志输出功能

- 添加了 ANSI 颜色代码常量定义
- 创建了正则表达式用于去除颜色码
- 实现了自定义 logWriter 结构体用于分离控制台和文件输出
- 控制台输出保留颜色,文件输出自动去除颜色码
- 更新了日志格式包含时间戳和颜色标识
- 修改了 Info、Error、Warn、Debug 函数的前缀格式
This commit is contained in:
2026-03-06 10:18:31 +08:00
parent de8348e424
commit 5affb5e653
2 changed files with 67 additions and 124 deletions
+51 -7
View File
@@ -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,6 +20,45 @@ 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()))
@@ -28,25 +69,28 @@ func init() {
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)
}
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...))
}
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())))
}
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...))
}
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...))
}