feat(log): 全面重构日志系统,支持日志级别、去除ANSI乱码并抑制高频轮询

This commit is contained in:
yml2213
2026-09-18 15:04:38 +08:00
parent 20bde97d7a
commit ec76844da8
15 changed files with 415 additions and 100 deletions
+107 -2
View File
@@ -8,12 +8,114 @@ import (
"path/filepath"
"strings"
"sync"
"sync/atomic"
"time"
"github.com/gin-gonic/gin"
"gorm.io/gorm/logger"
)
// Level 定义日志级别
type Level int32
const (
LevelDebug Level = iota
LevelInfo
LevelWarn
LevelError
)
func (l Level) String() string {
switch l {
case LevelDebug:
return "DEBUG"
case LevelInfo:
return "INFO"
case LevelWarn:
return "WARN"
case LevelError:
return "ERROR"
default:
return "INFO"
}
}
// ParseLevel 将字符串解析为日志级别,默认 INFO
func ParseLevel(s string) Level {
switch strings.ToLower(strings.TrimSpace(s)) {
case "debug":
return LevelDebug
case "warn", "warning":
return LevelWarn
case "error":
return LevelError
case "info":
return LevelInfo
default:
return LevelInfo
}
}
var currentLevel int32 = int32(LevelInfo)
// SetLevel 设置全局日志过滤级别
func SetLevel(lvl string) {
parsed := ParseLevel(lvl)
atomic.StoreInt32(&currentLevel, int32(parsed))
}
// GetLevel 获取当前日志级别
func GetLevel() Level {
return Level(atomic.LoadInt32(&currentLevel))
}
// IsDebug 是否允许输出 DEBUG 级别日志
func IsDebug() bool {
return GetLevel() <= LevelDebug
}
// IsInfo 是否允许输出 INFO 级别日志
func IsInfo() bool {
return GetLevel() <= LevelInfo
}
// IsWarn 是否允许输出 WARN 级别日志
func IsWarn() bool {
return GetLevel() <= LevelWarn
}
// Debugf 输出 DEBUG 级别日志
func Debugf(format string, args ...any) {
if GetLevel() > LevelDebug {
return
}
log.Printf("[DEBUG] "+format, args...)
}
// Infof 输出 INFO 级别日志
func Infof(format string, args ...any) {
if GetLevel() > LevelInfo {
return
}
log.Printf("[INFO] "+format, args...)
}
// Warnf 输出 WARN 级别日志
func Warnf(format string, args ...any) {
if GetLevel() > LevelWarn {
return
}
log.Printf("[WARN] "+format, args...)
}
// Errorf 输出 ERROR 级别日志
func Errorf(format string, args ...any) {
if GetLevel() > LevelError {
return
}
log.Printf("[ERROR] "+format, args...)
}
// logRetainDays 保留最近多少天的日志文件;<=0 不清理。
var logRetainDays = 30
@@ -142,13 +244,15 @@ func Setup(logFile string) (*os.File, error) {
log.SetOutput(mw)
log.SetFlags(log.LstdFlags | log.Lmicroseconds)
// Gin access / recovery 日志
// 禁用 Gin 的 ANSI 彩色输出,避免在日志文件中留下乱码转义字符
gin.DisableConsoleColor()
gin.DefaultWriter = mw
gin.DefaultErrorWriter = mw
if logFile != "" {
abs, _ := filepath.Abs(logFile)
log.Printf("[applog] 日志按天分割输出到 %s-YYYYMMDD.log(保留 %d 天)", strings.TrimSuffix(abs, filepath.Ext(abs)), logRetainDays)
Infof("[applog] 日志按天分割输出到 %s-YYYYMMDD.log(保留 %d 天,级别: %s)",
strings.TrimSuffix(abs, filepath.Ext(abs)), logRetainDays, GetLevel())
}
return f, nil
}
@@ -169,3 +273,4 @@ func NewGormLogger(mode string) logger.Interface {
},
)
}