logger.go 1.33 KB
Newer Older
Hamdi Allam's avatar
Hamdi Allam committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
package database

import (
	"context"
	"fmt"
	"strings"
	"time"

	"github.com/ethereum/go-ethereum/log"

	"gorm.io/gorm/logger"
)

var (
	_ logger.Interface = Logger{}

Hamdi Allam's avatar
Hamdi Allam committed
17
	SlowThresholdMilliseconds int64 = 500
Hamdi Allam's avatar
Hamdi Allam committed
18 19 20 21 22 23 24
)

type Logger struct {
	log log.Logger
}

func newLogger(log log.Logger) Logger {
Hamdi Allam's avatar
Hamdi Allam committed
25
	return Logger{log}
Hamdi Allam's avatar
Hamdi Allam committed
26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
}

func (l Logger) LogMode(lvl logger.LogLevel) logger.Interface {
	return l
}

func (l Logger) Info(ctx context.Context, msg string, data ...interface{}) {
	l.log.Info(fmt.Sprintf(msg, data...))
}

func (l Logger) Warn(ctx context.Context, msg string, data ...interface{}) {
	l.log.Warn(fmt.Sprintf(msg, data...))
}

func (l Logger) Error(ctx context.Context, msg string, data ...interface{}) {
	l.log.Error(fmt.Sprintf(msg, data...))
}

func (l Logger) Trace(ctx context.Context, begin time.Time, fc func() (sql string, rowsAffected int64), err error) {
	elapsedMs := time.Since(begin).Milliseconds()

	// omit any values for batch inserts as they can be very long
	sql, rows := fc()
	if i := strings.Index(strings.ToLower(sql), "values"); i > 0 {
		sql = fmt.Sprintf("%sVALUES (...)", sql[:i])
	}

Hamdi Allam's avatar
Hamdi Allam committed
53
	if elapsedMs < SlowThresholdMilliseconds {
Hamdi Allam's avatar
Hamdi Allam committed
54 55 56 57 58
		l.log.Debug("database operation", "duration_ms", elapsedMs, "rows_affected", rows, "sql", sql)
	} else {
		l.log.Warn("database operation", "duration_ms", elapsedMs, "rows_affected", rows, "sql", sql)
	}
}