|
- package loggers
-
- import (
- "context"
- "github.com/tal-tech/go-zero/core/logx"
- ll "gorm.io/gorm/logger"
- "gorm.io/gorm/utils"
- "time"
- )
-
- // LogLevel
- type LogLevel int
-
- // Writer log writer interface
- type Writer interface {
- Printf(string, ...interface{})
- }
-
- // Interface logger interface
- type Interface interface {
- LogMode(LogLevel) Interface
- Info(context.Context, string, ...interface{})
- Warn(context.Context, string, ...interface{})
- Error(context.Context, string, ...interface{})
- Trace(ctx context.Context, begin time.Time, fc func() (string, int64), err error)
- }
-
- var (
- //Discard = New(log.New(ioutil.Discard, "", log.LstdFlags), Config{})
- //Default = New(log.New(os.Stdout, "\r\n", log.LstdFlags), Config{
- // SlowThreshold: 100 * time.Millisecond,
- // LogLevel: Warn,
- // Colorful: true,
- //})
- //Recorder = traceRecorder{Interface: Default}
- )
-
- func New() ll.Interface {
- return &logger{}
- }
-
- type logger struct {
- Writer
- ll.Config
- infoStr, warnStr, errStr string
- traceStr, traceErrStr, traceWarnStr string
- }
-
- // LogMode log mode
- func (l logger) LogMode(level ll.LogLevel) ll.Interface {
- newlogger := l
- newlogger.LogLevel = level
- return &newlogger
- }
-
- // Info print info
- func (l logger) Info(ctx context.Context, msg string, data ...interface{}) {
- logx.Infof(l.infoStr+msg, data...)
- }
-
- // Warn print warn messages
- func (l logger) Warn(ctx context.Context, msg string, data ...interface{}) {
- logx.Infof(l.warnStr+msg, data...)
- }
-
- // Error print error messages
- func (l logger) Error(ctx context.Context, msg string, data ...interface{}) {
- logx.Errorf(l.errStr+msg, data...)
- }
-
- // Trace print sql message
- func (l logger) Trace(ctx 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 >= ll.Error:
- sql, rows := fc()
- if rows == -1 {
- logx.Error(l.traceErrStr, utils.FileWithLineNum(), err, float64(elapsed.Nanoseconds())/1e6, "-", sql)
- //l.Printf(l.traceErrStr, utils.FileWithLineNum(), err, float64(elapsed.Nanoseconds())/1e6, "-", sql)
- } else {
- logx.Error(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 && l.LogLevel >= ll.Warn:
- sql, rows := fc()
- if rows == -1 {
- logx.Info(l.traceWarnStr, utils.FileWithLineNum(), float64(elapsed.Nanoseconds())/1e6, "-", sql)
- } else {
- logx.Info(l.traceWarnStr, utils.FileWithLineNum(), float64(elapsed.Nanoseconds())/1e6, rows, sql)
- }
- case l.LogLevel >= ll.Info:
- sql, rows := fc()
- if rows == -1 {
- logx.Info(l.traceStr, utils.FileWithLineNum(), float64(elapsed.Nanoseconds())/1e6, "-", sql)
- } else {
- logx.Info(l.traceStr, utils.FileWithLineNum(), float64(elapsed.Nanoseconds())/1e6, rows, sql)
- }
- }
- }
- }
-
- type traceRecorder struct {
- Interface
- BeginAt time.Time
- SQL string
- RowsAffected int64
- Err error
- }
-
- func (l traceRecorder) New() *traceRecorder {
- return &traceRecorder{Interface: l.Interface}
- }
-
- func (l *traceRecorder) Trace(ctx context.Context, begin time.Time, fc func() (string, int64), err error) {
- l.BeginAt = begin
- l.SQL, l.RowsAffected = fc()
- l.Err = err
- }
|