Skip to content

Commit

Permalink
chore(gorm.v2): add logrus support + fix linter issues
Browse files Browse the repository at this point in the history
  • Loading branch information
hbollon committed Jun 16, 2021
1 parent f2dfd51 commit c4c9e95
Show file tree
Hide file tree
Showing 2 changed files with 106 additions and 4 deletions.
13 changes: 9 additions & 4 deletions db/db.go
Expand Up @@ -18,6 +18,7 @@ import (
ctyJson "github.com/zclconf/go-cty/cty/json"
"gorm.io/driver/postgres"
"gorm.io/gorm"
"gorm.io/gorm/logger"
)

// Database is a wrapping structure to *gorm.DB
Expand All @@ -39,13 +40,15 @@ func Init(config config.DBConfig, debug bool) *Database {
config.SSLMode,
config.Password,
)
db, err := gorm.Open(postgres.Open(connString), &gorm.Config{})
db, err := gorm.Open(postgres.Open(connString), &gorm.Config{
Logger: &LogrusGormLogger,
})
if err != nil {
log.Fatal(err)
}

log.Infof("Automigrate")
db.AutoMigrate(
err = db.AutoMigrate(
&types.Version{},
&types.State{},
&types.Module{},
Expand All @@ -66,10 +69,12 @@ func Init(config config.DBConfig, debug bool) *Database {
&types.PlanStateValue{},
&types.Change{},
)
if err != nil {
log.Fatalf("Migration failed: %v\n", err)
}

if debug {
//TODO: Upgrade db log system to gorm.v2
//db.LogMode(true)
db.Config.Logger.LogMode(logger.Info)
}
return &Database{db}
}
Expand Down
97 changes: 97 additions & 0 deletions db/logger.go
@@ -0,0 +1,97 @@
package db

import (
"context"
"fmt"
"time"

"github.com/sirupsen/logrus"
"gorm.io/gorm/logger"
"gorm.io/gorm/utils"
)

/*********************************************
* Custom logger definition for Gorm to use Logrus
* Implement gorm Logger iterface
* Based on : https://github.com/go-gorm/gorm/blob/master/logger/logger.go
*********************************************/

// GormLogger is a wrapper class that implement Gorm logger interface
type GormLogger struct {
GormLoggerConfig
}

// GormLoggerConfig handle GormLogger config (log level, slow threshold)
type GormLoggerConfig struct {
LogLevel logger.LogLevel
SlowThreshold time.Duration
}

var (
// LogrusGormLogger default GormLogger instance for Gorm logging through Logrus
LogrusGormLogger = GormLogger{
GormLoggerConfig{
LogLevel: logger.Warn,
SlowThreshold: 200 * time.Millisecond,
},
}
)

// LogMode log mode
func (l *GormLogger) LogMode(level logger.LogLevel) logger.Interface {
newlogger := *l
l.LogLevel = level
return &newlogger
}

// Info print info
func (l *GormLogger) Info(_ context.Context, msg string, data ...interface{}) {
if l.LogLevel >= logger.Info {
logrus.Info(msg, append([]interface{}{utils.FileWithLineNum()}, data...))
}
}

// Warn print warn messages
func (l *GormLogger) Warn(_ context.Context, msg string, data ...interface{}) {
if l.LogLevel >= logger.Warn {
logrus.Warn(msg, append([]interface{}{utils.FileWithLineNum()}, data...))
}
}

// Error print error messages
func (l *GormLogger) Error(_ context.Context, msg string, data ...interface{}) {
if l.LogLevel >= logger.Error {
logrus.Warn(msg, append([]interface{}{utils.FileWithLineNum()}, data...))
}
}

// Trace print sql message
func (l *GormLogger) Trace(_ context.Context, begin time.Time, fc func() (string, int64), err error) {
if l.LogLevel > 0 {
elapsed := time.Since(begin)
switch {
case err != nil && l.LogLevel >= logger.Error:
sql, rows := fc()
if rows == -1 {
logrus.Trace(utils.FileWithLineNum(), err, float64(elapsed.Nanoseconds())/1e6, "-", sql)
} else {
logrus.Trace(utils.FileWithLineNum(), err, float64(elapsed.Nanoseconds())/1e6, rows, sql)
}
case elapsed > l.SlowThreshold && l.SlowThreshold != 0 && l.LogLevel >= logger.Warn:
sql, rows := fc()
slowLog := fmt.Sprintf("SLOW SQL >= %v", l.SlowThreshold)
if rows == -1 {
logrus.Trace(utils.FileWithLineNum(), slowLog, float64(elapsed.Nanoseconds())/1e6, "-", sql)
} else {
logrus.Trace(utils.FileWithLineNum(), slowLog, float64(elapsed.Nanoseconds())/1e6, rows, sql)
}
case l.LogLevel >= logger.Info:
sql, rows := fc()
if rows == -1 {
logrus.Trace(utils.FileWithLineNum(), float64(elapsed.Nanoseconds())/1e6, "-", sql)
} else {
logrus.Trace(utils.FileWithLineNum(), float64(elapsed.Nanoseconds())/1e6, rows, sql)
}
}
}
}

0 comments on commit c4c9e95

Please sign in to comment.