feat 初始化
This commit is contained in:
@@ -29,7 +29,7 @@ func initOneDB(cfg *config.MySQLConfig) (*gorm.DB, error) {
|
||||
mysql.Open(cfg.Dsn),
|
||||
&gorm.Config{
|
||||
TranslateError: true,
|
||||
Logger: logger.Default.LogMode(parseLogLevel(cfg.LogLevel)),
|
||||
Logger: NewGormLogger(parseLogLevel(cfg.LogLevel)),
|
||||
},
|
||||
)
|
||||
if err != nil {
|
||||
|
||||
84
db/mysql/log.go
Normal file
84
db/mysql/log.go
Normal file
@@ -0,0 +1,84 @@
|
||||
package mysql
|
||||
|
||||
import (
|
||||
"context"
|
||||
"errors"
|
||||
"fmt"
|
||||
"git.hlsq.asia/alex/service-common/log"
|
||||
"go.opentelemetry.io/otel"
|
||||
"go.opentelemetry.io/otel/attribute"
|
||||
"go.uber.org/zap"
|
||||
"gorm.io/gorm"
|
||||
"gorm.io/gorm/logger"
|
||||
"time"
|
||||
)
|
||||
|
||||
// Colors
|
||||
const (
|
||||
Reset = "\033[0m"
|
||||
Blue = "\033[34m"
|
||||
)
|
||||
|
||||
type GormLogger struct {
|
||||
logLevel logger.LogLevel
|
||||
logger *zap.SugaredLogger
|
||||
}
|
||||
|
||||
func NewGormLogger(level logger.LogLevel) *GormLogger {
|
||||
return &GormLogger{
|
||||
logLevel: level,
|
||||
logger: log.GetLogger().
|
||||
WithOptions(zap.AddCallerSkip(5)).
|
||||
Named("GORM"),
|
||||
}
|
||||
}
|
||||
|
||||
func (l *GormLogger) LogMode(level logger.LogLevel) logger.Interface {
|
||||
newLogger := *l
|
||||
newLogger.logLevel = level
|
||||
return &newLogger
|
||||
}
|
||||
|
||||
func (l *GormLogger) Info(ctx context.Context, msg string, data ...interface{}) {
|
||||
if l.logLevel >= logger.Info {
|
||||
l.logger.Infof(Blue+msg+Reset, data...)
|
||||
}
|
||||
}
|
||||
|
||||
func (l *GormLogger) Warn(ctx context.Context, msg string, data ...interface{}) {
|
||||
if l.logLevel >= logger.Warn {
|
||||
l.logger.Warnf(Blue+msg+Reset, data...)
|
||||
}
|
||||
}
|
||||
|
||||
func (l *GormLogger) Error(ctx context.Context, msg string, data ...interface{}) {
|
||||
if l.logLevel >= logger.Error {
|
||||
l.logger.Errorf(Blue+msg+Reset, data...)
|
||||
}
|
||||
}
|
||||
|
||||
func (l *GormLogger) Trace(ctx context.Context, begin time.Time, fc func() (sql string, rowsAffected int64), err error) {
|
||||
if l.logLevel <= logger.Silent {
|
||||
return
|
||||
}
|
||||
|
||||
elapsed := time.Since(begin)
|
||||
sql, rows := fc()
|
||||
|
||||
if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) {
|
||||
l.logger.Errorf(Blue+"[SLOW SQL] [%v] [rows:%v] [error: %v] %v"+Reset, elapsed, rows, err.Error(), sql)
|
||||
l.SlowLog(ctx, elapsed, sql)
|
||||
} else if elapsed > 50*time.Millisecond {
|
||||
l.logger.Warnf(Blue+"[SLOW SQL] [%v] [rows:%v] %v"+Reset, elapsed, rows, sql)
|
||||
l.SlowLog(ctx, elapsed, sql)
|
||||
} else {
|
||||
l.logger.Infof(Blue+"[%v] [rows:%v] %v"+Reset, elapsed, rows, sql)
|
||||
}
|
||||
}
|
||||
|
||||
func (l *GormLogger) SlowLog(ctx context.Context, elapsed time.Duration, sql string) {
|
||||
_, span := otel.Tracer("common.db.mysql").Start(ctx, "mysql.slow")
|
||||
defer span.End()
|
||||
span.SetAttributes(attribute.String("elapsed", fmt.Sprintf("%v", elapsed)))
|
||||
span.SetAttributes(attribute.String("sql", sql))
|
||||
}
|
||||
Reference in New Issue
Block a user