logger.go 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. package logger
  2. import (
  3. "context"
  4. "errors"
  5. "fmt"
  6. "git.nspix.com/golang/micro/log"
  7. "gorm.io/gorm/logger"
  8. "gorm.io/gorm/utils"
  9. "time"
  10. )
  11. type Logger struct {
  12. LogLevel logger.LogLevel
  13. SlowThreshold time.Duration
  14. traceStr string
  15. traceErrStr string
  16. }
  17. func (lg *Logger) LogMode(level logger.LogLevel) logger.Interface {
  18. lg.LogLevel = level
  19. return lg
  20. }
  21. func (lg *Logger) Info(ctx context.Context, s string, i ...interface{}) {
  22. if lg.LogLevel >= logger.Info {
  23. log.Infof(s, i...)
  24. }
  25. }
  26. func (lg *Logger) Warn(ctx context.Context, s string, i ...interface{}) {
  27. if lg.LogLevel >= logger.Warn {
  28. log.Warnf(s, i...)
  29. }
  30. }
  31. func (lg *Logger) Error(ctx context.Context, s string, i ...interface{}) {
  32. if lg.LogLevel >= logger.Error {
  33. log.Errorf(s, i...)
  34. }
  35. }
  36. func (lg *Logger) Trace(ctx context.Context, begin time.Time, fc func() (sql string, rowsAffected int64), err error) {
  37. if lg.LogLevel <= logger.Silent {
  38. return
  39. }
  40. elapsed := time.Since(begin)
  41. switch {
  42. case err != nil && lg.LogLevel >= logger.Error && (!errors.Is(err, logger.ErrRecordNotFound)):
  43. sql, rows := fc()
  44. if rows == -1 {
  45. lg.Warn(ctx, lg.traceErrStr, sql, err, float64(elapsed.Nanoseconds())/1e6, "-", utils.FileWithLineNum())
  46. } else {
  47. lg.Warn(ctx, lg.traceErrStr, sql, err, float64(elapsed.Nanoseconds())/1e6, rows, utils.FileWithLineNum())
  48. }
  49. case elapsed > lg.SlowThreshold && lg.SlowThreshold != 0 && lg.LogLevel >= logger.Warn:
  50. sql, rows := fc()
  51. slowLog := fmt.Sprintf("SLOW SQL >= %v", lg.SlowThreshold)
  52. if rows == -1 {
  53. lg.Warn(ctx, lg.traceErrStr, sql, slowLog, float64(elapsed.Nanoseconds())/1e6, "-", utils.FileWithLineNum())
  54. } else {
  55. lg.Warn(ctx, lg.traceErrStr, sql, slowLog, float64(elapsed.Nanoseconds())/1e6, rows, utils.FileWithLineNum())
  56. }
  57. case lg.LogLevel == logger.Info:
  58. sql, rows := fc()
  59. if rows == -1 {
  60. lg.Info(ctx, lg.traceStr, sql, float64(elapsed.Nanoseconds())/1e6, "-", utils.FileWithLineNum())
  61. } else {
  62. lg.Info(ctx, lg.traceStr, sql, float64(elapsed.Nanoseconds())/1e6, rows, utils.FileWithLineNum())
  63. }
  64. }
  65. }
  66. func New() *Logger {
  67. return &Logger{
  68. SlowThreshold: time.Second * 10,
  69. traceStr: "%s [%.3fms] [rows:%v] in %s",
  70. traceErrStr: "%s [%s] [%.3fms] [rows:%v] in %s",
  71. }
  72. }