Add context to logger

This commit is contained in:
Jinzhu 2020-05-05 21:28:38 +08:00
parent 9dfed613db
commit 8def7be583
3 changed files with 19 additions and 16 deletions

View File

@ -1,6 +1,7 @@
package gorm package gorm
import ( import (
"context"
"errors" "errors"
"fmt" "fmt"
"reflect" "reflect"
@ -90,7 +91,7 @@ func (p *processor) Execute(db *DB) {
} }
if stmt := db.Statement; stmt != nil { if stmt := db.Statement; stmt != nil {
db.Logger.Trace(curTime, func() (string, int64) { db.Logger.Trace(stmt.Context, curTime, func() (string, int64) {
return db.Dialector.Explain(stmt.SQL.String(), stmt.Vars...), db.RowsAffected return db.Dialector.Explain(stmt.SQL.String(), stmt.Vars...), db.RowsAffected
}, db.Error) }, db.Error)
@ -141,7 +142,7 @@ func (p *processor) compile() (err error) {
} }
if p.fns, err = sortCallbacks(p.callbacks); err != nil { if p.fns, err = sortCallbacks(p.callbacks); err != nil {
logger.Default.Error("Got error when compile callbacks, got %v", err) logger.Default.Error(context.Background(), "Got error when compile callbacks, got %v", err)
} }
return return
} }
@ -164,7 +165,7 @@ func (c *callback) Register(name string, fn func(*DB)) error {
} }
func (c *callback) Remove(name string) error { func (c *callback) Remove(name string) error {
logger.Default.Warn("removing callback `%v` from %v\n", name, utils.FileWithLineNum()) logger.Default.Warn(context.Background(), "removing callback `%v` from %v\n", name, utils.FileWithLineNum())
c.name = name c.name = name
c.remove = true c.remove = true
c.processor.callbacks = append(c.processor.callbacks, c) c.processor.callbacks = append(c.processor.callbacks, c)
@ -172,7 +173,7 @@ func (c *callback) Remove(name string) error {
} }
func (c *callback) Replace(name string, fn func(*DB)) error { func (c *callback) Replace(name string, fn func(*DB)) error {
logger.Default.Info("replacing callback `%v` from %v\n", name, utils.FileWithLineNum()) logger.Default.Info(context.Background(), "replacing callback `%v` from %v\n", name, utils.FileWithLineNum())
c.name = name c.name = name
c.handler = fn c.handler = fn
c.replace = true c.replace = true
@ -199,7 +200,7 @@ func sortCallbacks(cs []*callback) (fns []func(*DB), err error) {
for _, c := range cs { for _, c := range cs {
// show warning message the callback name already exists // show warning message the callback name already exists
if idx := getRIndex(names, c.name); idx > -1 && !c.replace && !c.remove && !cs[idx].remove { if idx := getRIndex(names, c.name); idx > -1 && !c.replace && !c.remove && !cs[idx].remove {
logger.Default.Warn("duplicated callback `%v` from %v\n", c.name, utils.FileWithLineNum()) logger.Default.Warn(context.Background(), "duplicated callback `%v` from %v\n", c.name, utils.FileWithLineNum())
} }
names = append(names, c.name) names = append(names, c.name)
} }

View File

@ -1,6 +1,7 @@
package logger package logger
import ( import (
"context"
"log" "log"
"os" "os"
"time" "time"
@ -46,10 +47,10 @@ type Config struct {
// Interface logger interface // Interface logger interface
type Interface interface { type Interface interface {
LogMode(LogLevel) Interface LogMode(LogLevel) Interface
Info(string, ...interface{}) Info(context.Context, string, ...interface{})
Warn(string, ...interface{}) Warn(context.Context, string, ...interface{})
Error(string, ...interface{}) Error(context.Context, string, ...interface{})
Trace(begin time.Time, fc func() (string, int64), err error) Trace(ctx context.Context, begin time.Time, fc func() (string, int64), err error)
} }
var Default = New(log.New(os.Stdout, "\r\n", log.LstdFlags), Config{ var Default = New(log.New(os.Stdout, "\r\n", log.LstdFlags), Config{
@ -103,35 +104,35 @@ func (l logger) LogMode(level LogLevel) Interface {
} }
// Info print info // Info print info
func (l logger) Info(msg string, data ...interface{}) { func (l logger) Info(ctx context.Context, msg string, data ...interface{}) {
if l.LogLevel >= Info { if l.LogLevel >= Info {
l.Printf(l.infoStr+msg, append([]interface{}{utils.FileWithLineNum()}, data...)...) l.Printf(l.infoStr+msg, append([]interface{}{utils.FileWithLineNum()}, data...)...)
} }
} }
// Warn print warn messages // Warn print warn messages
func (l logger) Warn(msg string, data ...interface{}) { func (l logger) Warn(ctx context.Context, msg string, data ...interface{}) {
if l.LogLevel >= Warn { if l.LogLevel >= Warn {
l.Printf(l.warnStr+msg, append([]interface{}{utils.FileWithLineNum()}, data...)...) l.Printf(l.warnStr+msg, append([]interface{}{utils.FileWithLineNum()}, data...)...)
} }
} }
// Error print error messages // Error print error messages
func (l logger) Error(msg string, data ...interface{}) { func (l logger) Error(ctx context.Context, msg string, data ...interface{}) {
if l.LogLevel >= Error { if l.LogLevel >= Error {
l.Printf(l.errStr+msg, append([]interface{}{utils.FileWithLineNum()}, data...)...) l.Printf(l.errStr+msg, append([]interface{}{utils.FileWithLineNum()}, data...)...)
} }
} }
// Trace print sql message // Trace print sql message
func (l logger) Trace(begin time.Time, fc func() (string, int64), err error) { func (l logger) Trace(ctx context.Context, begin time.Time, fc func() (string, int64), err error) {
if l.LogLevel > 0 { if l.LogLevel > 0 {
elapsed := time.Now().Sub(begin) elapsed := time.Now().Sub(begin)
switch { switch {
case err != nil: case err != nil:
sql, rows := fc() sql, rows := fc()
l.Printf(l.traceErrStr, utils.FileWithLineNum(), err, float64(elapsed.Nanoseconds())/1e6, rows, sql) l.Printf(l.traceErrStr, utils.FileWithLineNum(), err, float64(elapsed.Nanoseconds())/1e6, rows, sql)
case elapsed > l.SlowThreshold && l.SlowThreshold != 0: case elapsed > l.SlowThreshold && l.SlowThreshold != 0 && l.LogLevel >= Warn:
sql, rows := fc() sql, rows := fc()
l.Printf(l.traceWarnStr, utils.FileWithLineNum(), float64(elapsed.Nanoseconds())/1e6, rows, sql) l.Printf(l.traceWarnStr, utils.FileWithLineNum(), float64(elapsed.Nanoseconds())/1e6, rows, sql)
case l.LogLevel >= Info: case l.LogLevel >= Info:

View File

@ -1,6 +1,7 @@
package schema package schema
import ( import (
"context"
"errors" "errors"
"fmt" "fmt"
"go/ast" "go/ast"
@ -83,7 +84,7 @@ func Parse(dest interface{}, cacheStore *sync.Map, namer Namer) (*Schema, error)
defer func() { defer func() {
if schema.err != nil { if schema.err != nil {
logger.Default.Error(schema.err.Error()) logger.Default.Error(context.Background(), schema.err.Error())
cacheStore.Delete(modelType) cacheStore.Delete(modelType)
} }
}() }()
@ -174,7 +175,7 @@ func Parse(dest interface{}, cacheStore *sync.Map, namer Namer) (*Schema, error)
case "func(*gorm.DB)": // TODO hack case "func(*gorm.DB)": // TODO hack
reflect.Indirect(reflect.ValueOf(schema)).FieldByName(name).SetBool(true) reflect.Indirect(reflect.ValueOf(schema)).FieldByName(name).SetBool(true)
default: default:
logger.Default.Warn("Model %v don't match %vInterface, should be %v(*gorm.DB)", schema, name, name) logger.Default.Warn(context.Background(), "Model %v don't match %vInterface, should be %v(*gorm.DB)", schema, name, name)
} }
} }
} }