123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182 |
- package internal
- import (
- "context"
- "fmt"
- "gin-vue-admin/global"
- "go.uber.org/zap"
- "gorm.io/gorm/logger"
- "gorm.io/gorm/utils"
- "io/ioutil"
- "log"
- "os"
- "time"
- )
- // writer log writer interface
- type writer interface {
- Printf(string, ...interface{})
- }
- type config struct {
- SlowThreshold time.Duration
- Colorful bool
- LogLevel logger.LogLevel
- }
- var (
- Discard = New(log.New(ioutil.Discard, "", log.LstdFlags), config{})
- Default = New(log.New(os.Stdout, "\r\n", log.LstdFlags), config{
- SlowThreshold: 200 * time.Millisecond,
- LogLevel: logger.Warn,
- Colorful: true,
- })
- Recorder = traceRecorder{Interface: Default, BeginAt: time.Now()}
- )
- func New(writer writer, config config) logger.Interface {
- var (
- infoStr = "%s\n[info] "
- warnStr = "%s\n[warn] "
- errStr = "%s\n[error] "
- traceStr = "%s\n[%.3fms] [rows:%v] %s"
- traceWarnStr = "%s %s\n[%.3fms] [rows:%v] %s"
- traceErrStr = "%s %s\n[%.3fms] [rows:%v] %s"
- )
- if config.Colorful {
- infoStr = logger.Green + "%s\n" + logger.Reset + logger.Green + "[info] " + logger.Reset
- warnStr = logger.BlueBold + "%s\n" + logger.Reset + logger.Magenta + "[warn] " + logger.Reset
- errStr = logger.Magenta + "%s\n" + logger.Reset + logger.Red + "[error] " + logger.Reset
- traceStr = logger.Green + "%s\n" + logger.Reset + logger.Yellow + "[%.3fms] " + logger.BlueBold + "[rows:%v]" + logger.Reset + " %s"
- traceWarnStr = logger.Green + "%s " + logger.Yellow + "%s\n" + logger.Reset + logger.RedBold + "[%.3fms] " + logger.Yellow + "[rows:%v]" + logger.Magenta + " %s" + logger.Reset
- traceErrStr = logger.RedBold + "%s " + logger.MagentaBold + "%s\n" + logger.Reset + logger.Yellow + "[%.3fms] " + logger.BlueBold + "[rows:%v]" + logger.Reset + " %s"
- }
- return &customLogger{
- writer: writer,
- config: config,
- infoStr: infoStr,
- warnStr: warnStr,
- errStr: errStr,
- traceStr: traceStr,
- traceWarnStr: traceWarnStr,
- traceErrStr: traceErrStr,
- }
- }
- type customLogger struct {
- writer
- config
- infoStr, warnStr, errStr string
- traceStr, traceErrStr, traceWarnStr string
- }
- // LogMode log mode
- func (c *customLogger) LogMode(level logger.LogLevel) logger.Interface {
- newLogger := *c
- newLogger.LogLevel = level
- return &newLogger
- }
- // Info print info
- func (c *customLogger) Info(ctx context.Context, message string, data ...interface{}) {
- if c.LogLevel >= logger.Info {
- c.Printf(c.infoStr+message, append([]interface{}{utils.FileWithLineNum()}, data...)...)
- }
- }
- // Warn print warn messages
- func (c *customLogger) Warn(ctx context.Context, message string, data ...interface{}) {
- if c.LogLevel >= logger.Warn {
- c.Printf(c.warnStr+message, append([]interface{}{utils.FileWithLineNum()}, data...)...)
- }
- }
- // Error print error messages
- func (c *customLogger) Error(ctx context.Context, message string, data ...interface{}) {
- if c.LogLevel >= logger.Error {
- c.Printf(c.errStr+message, append([]interface{}{utils.FileWithLineNum()}, data...)...)
- }
- }
- // Trace print sql message
- func (c *customLogger) Trace(ctx context.Context, begin time.Time, fc func() (string, int64), err error) {
- if c.LogLevel > 0 {
- elapsed := time.Since(begin)
- switch {
- case err != nil && c.LogLevel >= logger.Error:
- sql, rows := fc()
- if rows == -1 {
- c.Printf(c.traceErrStr, utils.FileWithLineNum(), err, float64(elapsed.Nanoseconds())/1e6, "-", sql)
- } else {
- c.Printf(c.traceErrStr, utils.FileWithLineNum(), err, float64(elapsed.Nanoseconds())/1e6, rows, sql)
- }
- case elapsed > c.SlowThreshold && c.SlowThreshold != 0 && c.LogLevel >= logger.Warn:
- sql, rows := fc()
- slowLog := fmt.Sprintf("SLOW SQL >= %v", c.SlowThreshold)
- if rows == -1 {
- c.Printf(c.traceWarnStr, utils.FileWithLineNum(), slowLog, float64(elapsed.Nanoseconds())/1e6, "-", sql)
- } else {
- c.Printf(c.traceWarnStr, utils.FileWithLineNum(), slowLog, float64(elapsed.Nanoseconds())/1e6, rows, sql)
- }
- case c.LogLevel >= logger.Info:
- sql, rows := fc()
- if rows == -1 {
- c.Printf(c.traceStr, utils.FileWithLineNum(), float64(elapsed.Nanoseconds())/1e6, "-", sql)
- } else {
- c.Printf(c.traceStr, utils.FileWithLineNum(), float64(elapsed.Nanoseconds())/1e6, rows, sql)
- }
- }
- }
- }
- func (c *customLogger) Printf(message string, data ...interface{}) {
- if global.GVA_CONFIG.Mysql.LogZap != "" {
- switch len(data) {
- case 0:
- global.GVA_LOG.Info(message)
- case 1:
- global.GVA_LOG.Info("gorm", zap.Any("src", data[0]))
- case 2:
- global.GVA_LOG.Info("gorm", zap.Any("src", data[0]), zap.Any("duration", data[1]))
- case 3:
- global.GVA_LOG.Info("gorm", zap.Any("src", data[0]), zap.Any("duration", data[1]), zap.Any("rows", data[2]))
- case 4:
- global.GVA_LOG.Info("gorm", zap.Any("src", data[0]), zap.Any("duration", data[1]), zap.Any("rows", data[2]), zap.Any("sql", data[3]))
- }
- return
- }
- switch len(data) {
- case 0:
- c.writer.Printf(message, "")
- case 1:
- c.writer.Printf(message, data[0])
- case 2:
- c.writer.Printf(message, data[0], data[1])
- case 3:
- c.writer.Printf(message, data[0], data[1], data[2])
- case 4:
- c.writer.Printf(message, data[0], data[1], data[2], data[3])
- case 5:
- c.writer.Printf(message, data[0], data[1], data[2], data[3], data[4])
- }
- }
- type traceRecorder struct {
- logger.Interface
- BeginAt time.Time
- SQL string
- RowsAffected int64
- Err error
- }
- func (t traceRecorder) New() *traceRecorder {
- return &traceRecorder{Interface: t.Interface, BeginAt: time.Now()}
- }
- func (t *traceRecorder) Trace(ctx context.Context, begin time.Time, fc func() (string, int64), err error) {
- t.BeginAt = begin
- t.SQL, t.RowsAffected = fc()
- t.Err = err
- }
|