97 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			97 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Go
		
	
	
	
package utils_gorm
 | 
						||
 | 
						||
import (
 | 
						||
	"context"
 | 
						||
	"fmt"
 | 
						||
	"gorm.io/gorm"
 | 
						||
	"gorm.io/gorm/logger"
 | 
						||
	"regexp"
 | 
						||
	"strings"
 | 
						||
	"time"
 | 
						||
)
 | 
						||
 | 
						||
type CustomLogger struct {
 | 
						||
	gormLogger logger.Interface
 | 
						||
	db         *gorm.DB
 | 
						||
}
 | 
						||
 | 
						||
func NewCustomLogger(db *gorm.DB) *CustomLogger {
 | 
						||
	return &CustomLogger{
 | 
						||
		gormLogger: logger.Default.LogMode(logger.Info),
 | 
						||
		db:         db,
 | 
						||
	}
 | 
						||
}
 | 
						||
 | 
						||
func (l *CustomLogger) LogMode(level logger.LogLevel) logger.Interface {
 | 
						||
	newlogger := *l
 | 
						||
	newlogger.gormLogger = l.gormLogger.LogMode(level)
 | 
						||
	return &newlogger
 | 
						||
}
 | 
						||
 | 
						||
func (l *CustomLogger) Info(ctx context.Context, msg string, data ...interface{}) {
 | 
						||
	l.gormLogger.Info(ctx, msg, data...)
 | 
						||
}
 | 
						||
 | 
						||
func (l *CustomLogger) Warn(ctx context.Context, msg string, data ...interface{}) {
 | 
						||
	l.gormLogger.Warn(ctx, msg, data...)
 | 
						||
}
 | 
						||
 | 
						||
func (l *CustomLogger) Error(ctx context.Context, msg string, data ...interface{}) {
 | 
						||
	l.gormLogger.Error(ctx, msg, data...)
 | 
						||
}
 | 
						||
 | 
						||
func (l *CustomLogger) Trace(ctx context.Context, begin time.Time, fc func() (sql string, rowsAffected int64), err error) {
 | 
						||
	elapsed := time.Since(begin)
 | 
						||
	sql, _ := fc()
 | 
						||
	l.gormLogger.Trace(ctx, begin, fc, err)
 | 
						||
	operation := extractOperation(sql)
 | 
						||
	tableName := extractTableName(sql)
 | 
						||
	fmt.Println(tableName)
 | 
						||
	//// 将SQL语句保存到数据库
 | 
						||
	if operation == 0 || tableName == "sql_log" {
 | 
						||
		return
 | 
						||
	}
 | 
						||
	//go l.db.Model(&SqlLog{}).Create(&SqlLog{
 | 
						||
	//	OperatorID:   1,
 | 
						||
	//	OperatorName: "test",
 | 
						||
	//	SqlInfo:      sql,
 | 
						||
	//	TableNames:   tableName,
 | 
						||
	//	Type:         operation,
 | 
						||
	//})
 | 
						||
 | 
						||
	// 如果有需要,也可以根据执行时间(elapsed)等条件过滤或处理日志记录
 | 
						||
	if elapsed > time.Second {
 | 
						||
		//l.gormLogger.Warn(ctx, "Slow SQL (> 1s): %s", sql)
 | 
						||
	}
 | 
						||
}
 | 
						||
 | 
						||
// extractTableName extracts the table name from a SQL query, supporting quoted table names.
 | 
						||
func extractTableName(sql string) string {
 | 
						||
	// 使用非捕获组匹配多种SQL操作关键词
 | 
						||
	re := regexp.MustCompile(`(?i)\b(?:from|update|into|delete\s+from)\b\s+[\` + "`" + `"]?(\w+)[\` + "`" + `"]?`)
 | 
						||
	match := re.FindStringSubmatch(sql)
 | 
						||
 | 
						||
	// 检查是否匹配成功
 | 
						||
	if len(match) > 1 {
 | 
						||
		return match[1]
 | 
						||
	}
 | 
						||
 | 
						||
	return ""
 | 
						||
}
 | 
						||
 | 
						||
// extractOperation extracts the operation type from a SQL query.
 | 
						||
func extractOperation(sql string) int32 {
 | 
						||
	sql = strings.TrimSpace(strings.ToLower(sql))
 | 
						||
	var operation int32
 | 
						||
	if strings.HasPrefix(sql, "select") {
 | 
						||
		operation = 0
 | 
						||
	} else if strings.HasPrefix(sql, "insert") {
 | 
						||
		operation = 1
 | 
						||
	} else if strings.HasPrefix(sql, "update") {
 | 
						||
		operation = 3
 | 
						||
	} else if strings.HasPrefix(sql, "delete") {
 | 
						||
		operation = 2
 | 
						||
	}
 | 
						||
	return operation
 | 
						||
}
 |