feat(log): 实现日志系统彩色输出和文件分离功能
- 添加 ANSI 颜色常量定义支持彩色输出 - 实现 stripAnsiColors 函数去除 ANSI 颜色码 - 创建 logWriter 结构体实现控制台带颜色文件无颜色的输出 - 修改初始化逻辑使用自定义 writer 替代 MultiWriter - 更新 Info、Error、Warn、Debug 函数添加时间戳和颜色前缀 - 将日志文件大小限制从 1MB 调整为 2MB - 移除默认日志标志位,使用自定义格式化输出main v1.0.1011
parent
6bfe26bbf7
commit
5a37aea56f
67
log/log.go
67
log/log.go
|
|
@ -5,8 +5,10 @@ import (
|
||||||
"io"
|
"io"
|
||||||
"log"
|
"log"
|
||||||
"os"
|
"os"
|
||||||
|
"regexp"
|
||||||
"runtime/debug"
|
"runtime/debug"
|
||||||
"strings"
|
"strings"
|
||||||
|
"time"
|
||||||
|
|
||||||
"github.com/gogf/gf/v2/os/gfile"
|
"github.com/gogf/gf/v2/os/gfile"
|
||||||
"github.com/gogf/gf/v2/os/gtime"
|
"github.com/gogf/gf/v2/os/gtime"
|
||||||
|
|
@ -18,42 +20,77 @@ var (
|
||||||
sysLog *log.Logger
|
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() {
|
func init() {
|
||||||
logPath = gfile.Join(gfile.Pwd(), "logs")
|
logPath = gfile.Join(gfile.Pwd(), "logs")
|
||||||
filePath := gfile.Join(logPath, fmt.Sprintf("log-%s.log", gtime.Date()))
|
filePath := gfile.Join(logPath, fmt.Sprintf("log-%s.log", gtime.Date()))
|
||||||
fileLogger := &lumberjack.Logger{
|
fileLogger := &lumberjack.Logger{
|
||||||
Filename: filePath,
|
Filename: filePath,
|
||||||
MaxSize: 1, // 单个文件最大 10MB
|
MaxSize: 2, // 单个文件最大 10MB
|
||||||
MaxBackups: 5, // 最多保留 5 个备份
|
MaxBackups: 5, // 最多保留 5 个备份
|
||||||
MaxAge: 30, // 保留 30 天
|
MaxAge: 30, // 保留 30 天
|
||||||
Compress: false, // 启用压缩
|
Compress: false, // 启用压缩
|
||||||
}
|
}
|
||||||
// 创建 MultiWriter 实现同时输出到文件和终端
|
// 使用自定义 writer 实现控制台带颜色、文件无颜色的输出
|
||||||
multiWriter := io.MultiWriter(fileLogger, os.Stdout)
|
multiWriter := &logWriter{
|
||||||
sysLog = log.New(multiWriter, "", log.LstdFlags)
|
console: os.Stdout,
|
||||||
|
file: fileLogger,
|
||||||
|
}
|
||||||
|
sysLog = log.New(multiWriter, "", 0)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Info 打印普通信息日志
|
|
||||||
func Info(v ...any) {
|
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...))
|
sysLog.Println(fmt.Sprint(v...))
|
||||||
}
|
}
|
||||||
|
|
||||||
// Error 打印错误日志
|
|
||||||
func Error(v ...any) {
|
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...)
|
msg := fmt.Sprint(v...)
|
||||||
sysLog.Println(msg, strings.TrimSpace(string(debug.Stack())))
|
sysLog.Println(msg, strings.TrimSpace(string(debug.Stack())))
|
||||||
}
|
}
|
||||||
|
|
||||||
// Warn 打印警告日志
|
|
||||||
func Warn(v ...any) {
|
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...))
|
sysLog.Println(fmt.Sprint(v...))
|
||||||
}
|
}
|
||||||
|
|
||||||
// Debug 打印调试日志
|
|
||||||
func Debug(v ...any) {
|
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...))
|
sysLog.Println(fmt.Sprint(v...))
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue