diff --git a/go.mod b/go.mod index 4fd705b..ab40cf7 100644 --- a/go.mod +++ b/go.mod @@ -14,6 +14,7 @@ require ( github.com/loveuer/nf v0.3.1 github.com/samber/lo v1.47.0 github.com/spf13/cast v1.7.1 + go.uber.org/zap v1.27.0 golang.org/x/crypto v0.25.0 gopkg.in/yaml.v3 v3.0.1 gorm.io/driver/mysql v1.5.7 @@ -39,6 +40,7 @@ require ( github.com/mattn/go-runewidth v0.0.15 // indirect github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect github.com/rivo/uniseg v0.2.0 // indirect + go.uber.org/multierr v1.10.0 // indirect golang.org/x/sync v0.10.0 // indirect golang.org/x/sys v0.25.0 // indirect golang.org/x/text v0.21.0 // indirect diff --git a/go.sum b/go.sum index 8294d1c..0793fb3 100644 --- a/go.sum +++ b/go.sum @@ -75,6 +75,11 @@ github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+ github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/multierr v1.10.0 h1:S0h4aNzvfcFsC3dRF1jLoaov7oRaKqRGC/pUEJ2yvPQ= +go.uber.org/multierr v1.10.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= golang.org/x/crypto v0.25.0 h1:ypSNr+bnYL2YhwoMt2zPxHFmbAN1KZs/njMG3hxUp30= golang.org/x/crypto v0.25.0/go.mod h1:T+wALwcMOSE0kXgUAnPAHqTLW+XHgcELELW8VaDgm/M= golang.org/x/net v0.27.0 h1:5K3Njcw06/l2y9vpGCSdcxWOYHOUk3dVNGDXN+FvAys= diff --git a/log.go b/log.go index 2a37b33..914d16a 100644 --- a/log.go +++ b/log.go @@ -7,15 +7,37 @@ import ( "github.com/google/uuid" "github.com/loveuer/uzone/pkg/api" "github.com/loveuer/uzone/pkg/log" + "go.uber.org/zap" ) type uzone_logger struct { - ctx context.Context + ctx context.Context + caller string + sugar *zap.SugaredLogger +} + +func (ul *uzone_logger) WithContext(ctx context.Context) *uzone_logger { + ul.ctx = ctx + return ul +} + +// func (ul *uzone_logger) WithCaller(caller string) *uzone_logger { +// ul.caller = caller +// return ul +// } + +func (ul *uzone_logger) GC() { + ul.ctx = nil + ul.caller = "" + ul.sugar = nil + log.Logger.Sync() + uzone_logger_pool.Put(ul) } var uzone_logger_pool = &sync.Pool{ New: func() any { - return &uzone_logger{} + s := log.Logger.Sugar() + return &uzone_logger{sugar: s} }, } @@ -32,36 +54,31 @@ func (ul *uzone_logger) traceId() string { } func (ul *uzone_logger) Debug(msg string, data ...any) { - log.Debug(ul.traceId()+" | "+msg, data...) - - uzone_logger_pool.Put(ul) + ul.sugar.With("trace", ul.traceId()).Debugf(msg, data...) + ul.GC() } func (ul *uzone_logger) Info(msg string, data ...any) { - log.Info(ul.traceId()+" | "+msg, data...) - - uzone_logger_pool.Put(ul) + ul.sugar.With("trace", ul.traceId()).Infof(msg, data...) + ul.GC() } func (ul *uzone_logger) Warn(msg string, data ...any) { - log.Warn(ul.traceId()+" | "+msg, data...) - - uzone_logger_pool.Put(ul) + ul.sugar.With("trace", ul.traceId()).Warnf(msg, data...) + ul.GC() } func (ul *uzone_logger) Error(msg string, data ...any) { - log.Error(ul.traceId()+" | "+msg, data...) - - uzone_logger_pool.Put(ul) + ul.sugar.With("trace", ul.traceId()).Errorf(msg, data...) + ul.GC() } func (ul *uzone_logger) Panic(msg string, data ...any) { - log.Panic(ul.traceId()+" | "+msg, data...) - uzone_logger_pool.Put(ul) + ul.sugar.With("trace", ul.traceId()).Panicf(msg, data...) + ul.GC() } func (ul *uzone_logger) Fatal(msg string, data ...any) { - log.Fatal(ul.traceId()+" | "+msg, data...) - - uzone_logger_pool.Put(ul) + ul.sugar.With("trace", ul.traceId()).Fatalf(msg, data...) + ul.GC() } diff --git a/pkg/db/new.go b/pkg/db/new.go index 2781dab..0e0394c 100644 --- a/pkg/db/new.go +++ b/pkg/db/new.go @@ -32,11 +32,11 @@ func New(uri string) (*gorm.DB, error) { switch ins.Scheme { case "sqlite": path := strings.TrimPrefix(uri, ins.Scheme+"://") - log.Debug("db.New: type = %s, path = %s", ins.Scheme, path) + log.Logger.Sugar().Debugf("db.New: type = %s, path = %s", ins.Scheme, path) tx, err = gorm.Open(sqlite.Open(path)) case "mysql", "mariadb": dsn := fmt.Sprintf("%s:%s@tcp(%s)/%s?%s", username, password, ins.Host, ins.Path, ins.RawQuery) - log.Debug("db.New: type = %s, dsn = %s", ins.Scheme, dsn) + log.Logger.Sugar().Debugf("db.New: type = %s, dsn = %s", ins.Scheme, dsn) tx, err = gorm.Open(mysql.Open(dsn)) case "pg", "postgres", "postgresql": opts := make([]string, 0) @@ -44,7 +44,7 @@ func New(uri string) (*gorm.DB, error) { opts = append(opts, fmt.Sprintf("%s=%s", key, val)) } dsn := fmt.Sprintf("host=%s user=%s password=%s dbname=%s port=%s %s", ins.Hostname(), username, password, ins.Path, ins.Port(), strings.Join(opts, " ")) - log.Debug("db.New: type = %s, dsn = %s", ins.Scheme, dsn) + log.Logger.Sugar().Debugf("db.New: type = %s, dsn = %s", ins.Scheme, dsn) tx, err = gorm.Open(postgres.Open(dsn)) default: return nil, fmt.Errorf("invalid database type(uri_scheme): %s", ins.Scheme) diff --git a/pkg/interfaces/upp.go b/pkg/interfaces/uzone.go similarity index 100% rename from pkg/interfaces/upp.go rename to pkg/interfaces/uzone.go diff --git a/pkg/log/default.go b/pkg/log/default.go deleted file mode 100644 index 7ecf5e7..0000000 --- a/pkg/log/default.go +++ /dev/null @@ -1,67 +0,0 @@ -package log - -import ( - "fmt" - "os" - "sync" -) - -var ( - nilLogger = func(prefix, timestamp, msg string, data ...any) {} - normalLogger = func(prefix, timestamp, msg string, data ...any) { - fmt.Printf(prefix+"| "+timestamp+" | "+msg+"\n", data...) - } - - panicLogger = func(prefix, timestamp, msg string, data ...any) { - panic(fmt.Sprintf(prefix+"| "+timestamp+" | "+msg+"\n", data...)) - } - - fatalLogger = func(prefix, timestamp, msg string, data ...any) { - fmt.Printf(prefix+"| "+timestamp+" | "+msg+"\n", data...) - os.Exit(1) - } - - DefaultLogger = &logger{ - Mutex: sync.Mutex{}, - timeFormat: "2006-01-02T15:04:05", - writer: os.Stdout, - level: LogLevelInfo, - debug: nilLogger, - info: normalLogger, - warn: normalLogger, - error: normalLogger, - panic: panicLogger, - fatal: fatalLogger, - } -) - -func SetTimeFormat(format string) { - DefaultLogger.SetTimeFormat(format) -} - -func SetLogLevel(level LogLevel) { - DefaultLogger.SetLogLevel(level) -} - -func Debug(msg string, data ...any) { - DefaultLogger.Debug(msg, data...) -} -func Info(msg string, data ...any) { - DefaultLogger.Info(msg, data...) -} - -func Warn(msg string, data ...any) { - DefaultLogger.Warn(msg, data...) -} - -func Error(msg string, data ...any) { - DefaultLogger.Error(msg, data...) -} - -func Panic(msg string, data ...any) { - DefaultLogger.Panic(msg, data...) -} - -func Fatal(msg string, data ...any) { - DefaultLogger.Fatal(msg, data...) -} diff --git a/pkg/log/log.go b/pkg/log/log.go index 9e55695..2beaa13 100644 --- a/pkg/log/log.go +++ b/pkg/log/log.go @@ -1,115 +1,36 @@ package log import ( - "github.com/fatih/color" - "io" "sync" - "time" + + "go.uber.org/zap" ) -type LogLevel uint32 - -const ( - LogLevelDebug = iota - LogLevelInfo - LogLevelWarn - LogLevelError - LogLevelPanic - LogLevelFatal -) - -type logger struct { - sync.Mutex - timeFormat string - writer io.Writer - level LogLevel - debug func(prefix, timestamp, msg string, data ...any) - info func(prefix, timestamp, msg string, data ...any) - warn func(prefix, timestamp, msg string, data ...any) - error func(prefix, timestamp, msg string, data ...any) - panic func(prefix, timestamp, msg string, data ...any) - fatal func(prefix, timestamp, msg string, data ...any) -} - var ( - red = color.New(color.FgRed) - hired = color.New(color.FgHiRed) - green = color.New(color.FgGreen) - yellow = color.New(color.FgYellow) - white = color.New(color.FgWhite) + Logger *zap.Logger + locker = &sync.Mutex{} ) -func (l *logger) SetTimeFormat(format string) { - l.Lock() - defer l.Unlock() - l.timeFormat = format -} - -func (l *logger) SetLogLevel(level LogLevel) { - l.Lock() - defer l.Unlock() - - if level > LogLevelDebug { - l.debug = nilLogger - } else { - l.debug = normalLogger - } - - if level > LogLevelInfo { - l.info = nilLogger - } else { - l.info = normalLogger - } - - if level > LogLevelWarn { - l.warn = nilLogger - } else { - l.warn = normalLogger - } - - if level > LogLevelError { - l.error = nilLogger - } else { - l.error = normalLogger - } - - if level > LogLevelPanic { - l.panic = nilLogger - } else { - l.panic = panicLogger - } - - if level > LogLevelFatal { - l.fatal = nilLogger - } else { - l.fatal = fatalLogger +func init() { + var err error + config := zap.NewProductionConfig() + Logger, err = config.Build() + if err != nil { + panic(err) } } -func (l *logger) Debug(msg string, data ...any) { - l.debug(white.Sprint("Debug "), time.Now().Format(l.timeFormat), msg, data...) -} +func Debug() { + var err error -func (l *logger) Info(msg string, data ...any) { - l.info(green.Sprint("Info "), time.Now().Format(l.timeFormat), msg, data...) -} + config := zap.NewProductionConfig() + config.Level = zap.NewAtomicLevelAt(zap.DebugLevel) -func (l *logger) Warn(msg string, data ...any) { - l.warn(yellow.Sprint("Warn "), time.Now().Format(l.timeFormat), msg, data...) -} + locker.Lock() + defer locker.Unlock() -func (l *logger) Error(msg string, data ...any) { - l.error(red.Sprint("Error "), time.Now().Format(l.timeFormat), msg, data...) -} - -func (l *logger) Panic(msg string, data ...any) { - l.panic(hired.Sprint("Panic "), time.Now().Format(l.timeFormat), msg, data...) -} - -func (l *logger) Fatal(msg string, data ...any) { - l.fatal(hired.Sprint("Fatal "), time.Now().Format(l.timeFormat), msg, data...) -} - -type WroteLogger interface { - Info(msg string, data ...any) + Logger, err = config.Build() + if err != nil { + panic(err) + } } diff --git a/pkg/log/new.go b/pkg/log/new.go deleted file mode 100644 index 204fac1..0000000 --- a/pkg/log/new.go +++ /dev/null @@ -1,21 +0,0 @@ -package log - -import ( - "os" - "sync" -) - -func New() *logger { - return &logger{ - Mutex: sync.Mutex{}, - timeFormat: "2006-01-02T15:04:05", - writer: os.Stdout, - level: LogLevelInfo, - debug: nilLogger, - info: normalLogger, - warn: normalLogger, - error: normalLogger, - panic: panicLogger, - fatal: fatalLogger, - } -} diff --git a/pkg/tool/must.go b/pkg/tool/must.go index d6f5a1e..afd8515 100644 --- a/pkg/tool/must.go +++ b/pkg/tool/must.go @@ -5,7 +5,7 @@ import "github.com/loveuer/uzone/pkg/log" func Must(errs ...error) { for _, err := range errs { if err != nil { - log.Panic(err.Error()) + log.Logger.Panic(err.Error()) } } } diff --git a/pkg/tool/password.go b/pkg/tool/password.go index d037ee0..9ab8371 100644 --- a/pkg/tool/password.go +++ b/pkg/tool/password.go @@ -9,7 +9,6 @@ import ( "strconv" "strings" - "github.com/loveuer/uzone/pkg/log" "golang.org/x/crypto/pbkdf2" ) @@ -21,26 +20,29 @@ func NewPassword(password string) string { return EncryptPassword(password, RandomString(8), int(RandomInt(50000)+100000)) } -func ComparePassword(in, db string) bool { +// ComparePassword +// if password in and db are same, return nil +func ComparePassword(in, db string) error { strs := strings.Split(db, "$") if len(strs) != 3 { - log.Error("password in db invalid: %s", db) - return false + return fmt.Errorf("password in db invalid: %s", db) } encs := strings.Split(strs[0], ":") if len(encs) != 3 { - log.Error("password in db invalid: %s", db) - return false + return fmt.Errorf("password in db invalid: %s", db) } encIteration, err := strconv.Atoi(encs[2]) if err != nil { - log.Error("password in db invalid: %s, convert iter err: %s", db, err) - return false + return fmt.Errorf("password in db invalid: %s, convert iter err: %s", db, err) } - return EncryptPassword(in, strs[1], encIteration) == db + if EncryptPassword(in, strs[1], encIteration) != db { + return fmt.Errorf("password input and db not same") + } + + return nil } func EncryptPassword(password, salt string, iter int) string { @@ -66,7 +68,6 @@ func CheckPassword(password string) error { for idx, pattern := range patternList { match, err = regexp.MatchString(pattern, password) if err != nil { - log.Warn("regex match string err, reg_str: %s, err: %v", pattern, err) return errors.New("密码强度不够") } diff --git a/pkg/tool/table.go b/pkg/tool/table.go index 0ea03b0..eb6bea1 100644 --- a/pkg/tool/table.go +++ b/pkg/tool/table.go @@ -8,8 +8,9 @@ import ( "reflect" "strings" - "github.com/jedib0t/go-pretty/v6/table" "github.com/loveuer/uzone/pkg/log" + + "github.com/jedib0t/go-pretty/v6/table" ) func TablePrinter(data any, writers ...io.Writer) { @@ -81,8 +82,6 @@ Start: p := fmt.Sprintf("%s.%s", prefix, rv.Type().Field(i).Name) field := rv.Field(i) - // log.Debug("TablePrinter: prefix: %s, field: %v", p, rv.Field(i)) - if !field.CanInterface() { return } @@ -95,7 +94,7 @@ Start: func TableMapPrinter(data []byte) { m := make(map[string]any) if err := json.Unmarshal(data, &m); err != nil { - log.Warn(err.Error()) + log.Logger.Warn(err.Error()) return } diff --git a/uzone.go b/uzone.go index 1424110..418cf74 100644 --- a/uzone.go +++ b/uzone.go @@ -65,7 +65,7 @@ func New(configs ...Config) *uzone { } if config.Debug || property.Debug { - log.SetLogLevel(log.LogLevelDebug) + log.Debug() app.debug = true }