|
@@ -0,0 +1,58 @@
|
|
|
|
+package logger
|
|
|
|
+
|
|
|
|
+import (
|
|
|
|
+ "context"
|
|
|
|
+ "errors"
|
|
|
|
+ "fmt"
|
|
|
|
+ "git.nspix.com/golang/micro/log"
|
|
|
|
+ "gorm.io/gorm"
|
|
|
|
+ "gorm.io/gorm/logger"
|
|
|
|
+ "gorm.io/gorm/utils"
|
|
|
|
+ "time"
|
|
|
|
+)
|
|
|
|
+
|
|
|
|
+type Logger struct {
|
|
|
|
+ LogLevel logger.LogLevel
|
|
|
|
+ SlowThreshold time.Duration
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+func (l Logger) LogMode(level logger.LogLevel) logger.Interface {
|
|
|
|
+ l.LogLevel = level
|
|
|
|
+ return l
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+func (l Logger) Info(ctx context.Context, s string, i ...interface{}) {
|
|
|
|
+ log.Infof("[SQL] "+s, i...)
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+func (l Logger) Warn(ctx context.Context, s string, i ...interface{}) {
|
|
|
|
+ log.Warnf("[SQL] "+s, i...)
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+func (l Logger) Error(ctx context.Context, s string, i ...interface{}) {
|
|
|
|
+ log.Errorf("[SQL] "+s, i...)
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+func (l Logger) Trace(ctx context.Context, begin time.Time, fc func() (sql string, rowsAffected int64), err error) {
|
|
|
|
+ elapsed := time.Since(begin)
|
|
|
|
+ switch {
|
|
|
|
+ case err != nil && l.LogLevel >= logger.Error && (!errors.Is(err, gorm.ErrRecordNotFound)):
|
|
|
|
+ sql, rows := fc()
|
|
|
|
+ if rows == -1 {
|
|
|
|
+ l.Error(ctx, sql)
|
|
|
|
+ } else {
|
|
|
|
+ l.Error(ctx, sql)
|
|
|
|
+ }
|
|
|
|
+ case elapsed > l.SlowThreshold && l.SlowThreshold != 0:
|
|
|
|
+ sql, _ := fc()
|
|
|
|
+ slowLog := fmt.Sprintf("slow sql [%s] spend %s in %s", sql, elapsed, utils.FileWithLineNum())
|
|
|
|
+ l.Warn(ctx, slowLog)
|
|
|
|
+ case l.LogLevel == logger.Info:
|
|
|
|
+ sql, rows := fc()
|
|
|
|
+ if rows == -1 {
|
|
|
|
+ log.Debugf("[SQL] %s", sql)
|
|
|
|
+ } else {
|
|
|
|
+ log.Debugf("[SQL] %s -> %d", sql, rows)
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+}
|