wip: refactory log with zap

This commit is contained in:
loveuer 2025-03-10 22:41:10 +08:00
parent 0cf05cdf30
commit 1ea5507e5f
12 changed files with 82 additions and 225 deletions

2
go.mod
View File

@ -14,6 +14,7 @@ require (
github.com/loveuer/nf v0.3.1 github.com/loveuer/nf v0.3.1
github.com/samber/lo v1.47.0 github.com/samber/lo v1.47.0
github.com/spf13/cast v1.7.1 github.com/spf13/cast v1.7.1
go.uber.org/zap v1.27.0
golang.org/x/crypto v0.25.0 golang.org/x/crypto v0.25.0
gopkg.in/yaml.v3 v3.0.1 gopkg.in/yaml.v3 v3.0.1
gorm.io/driver/mysql v1.5.7 gorm.io/driver/mysql v1.5.7
@ -39,6 +40,7 @@ require (
github.com/mattn/go-runewidth v0.0.15 // indirect github.com/mattn/go-runewidth v0.0.15 // indirect
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect
github.com/rivo/uniseg v0.2.0 // 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/sync v0.10.0 // indirect
golang.org/x/sys v0.25.0 // indirect golang.org/x/sys v0.25.0 // indirect
golang.org/x/text v0.21.0 // indirect golang.org/x/text v0.21.0 // indirect

5
go.sum
View File

@ -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.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.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= 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 h1:ypSNr+bnYL2YhwoMt2zPxHFmbAN1KZs/njMG3hxUp30=
golang.org/x/crypto v0.25.0/go.mod h1:T+wALwcMOSE0kXgUAnPAHqTLW+XHgcELELW8VaDgm/M= 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= golang.org/x/net v0.27.0 h1:5K3Njcw06/l2y9vpGCSdcxWOYHOUk3dVNGDXN+FvAys=

55
log.go
View File

@ -7,15 +7,37 @@ import (
"github.com/google/uuid" "github.com/google/uuid"
"github.com/loveuer/uzone/pkg/api" "github.com/loveuer/uzone/pkg/api"
"github.com/loveuer/uzone/pkg/log" "github.com/loveuer/uzone/pkg/log"
"go.uber.org/zap"
) )
type uzone_logger struct { 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{ var uzone_logger_pool = &sync.Pool{
New: func() any { 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) { func (ul *uzone_logger) Debug(msg string, data ...any) {
log.Debug(ul.traceId()+" | "+msg, data...) ul.sugar.With("trace", ul.traceId()).Debugf(msg, data...)
ul.GC()
uzone_logger_pool.Put(ul)
} }
func (ul *uzone_logger) Info(msg string, data ...any) { func (ul *uzone_logger) Info(msg string, data ...any) {
log.Info(ul.traceId()+" | "+msg, data...) ul.sugar.With("trace", ul.traceId()).Infof(msg, data...)
ul.GC()
uzone_logger_pool.Put(ul)
} }
func (ul *uzone_logger) Warn(msg string, data ...any) { func (ul *uzone_logger) Warn(msg string, data ...any) {
log.Warn(ul.traceId()+" | "+msg, data...) ul.sugar.With("trace", ul.traceId()).Warnf(msg, data...)
ul.GC()
uzone_logger_pool.Put(ul)
} }
func (ul *uzone_logger) Error(msg string, data ...any) { func (ul *uzone_logger) Error(msg string, data ...any) {
log.Error(ul.traceId()+" | "+msg, data...) ul.sugar.With("trace", ul.traceId()).Errorf(msg, data...)
ul.GC()
uzone_logger_pool.Put(ul)
} }
func (ul *uzone_logger) Panic(msg string, data ...any) { func (ul *uzone_logger) Panic(msg string, data ...any) {
log.Panic(ul.traceId()+" | "+msg, data...) ul.sugar.With("trace", ul.traceId()).Panicf(msg, data...)
uzone_logger_pool.Put(ul) ul.GC()
} }
func (ul *uzone_logger) Fatal(msg string, data ...any) { func (ul *uzone_logger) Fatal(msg string, data ...any) {
log.Fatal(ul.traceId()+" | "+msg, data...) ul.sugar.With("trace", ul.traceId()).Fatalf(msg, data...)
ul.GC()
uzone_logger_pool.Put(ul)
} }

View File

@ -32,11 +32,11 @@ func New(uri string) (*gorm.DB, error) {
switch ins.Scheme { switch ins.Scheme {
case "sqlite": case "sqlite":
path := strings.TrimPrefix(uri, ins.Scheme+"://") 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)) tx, err = gorm.Open(sqlite.Open(path))
case "mysql", "mariadb": case "mysql", "mariadb":
dsn := fmt.Sprintf("%s:%s@tcp(%s)/%s?%s", username, password, ins.Host, ins.Path, ins.RawQuery) 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)) tx, err = gorm.Open(mysql.Open(dsn))
case "pg", "postgres", "postgresql": case "pg", "postgres", "postgresql":
opts := make([]string, 0) opts := make([]string, 0)
@ -44,7 +44,7 @@ func New(uri string) (*gorm.DB, error) {
opts = append(opts, fmt.Sprintf("%s=%s", key, val)) 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, " ")) 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)) tx, err = gorm.Open(postgres.Open(dsn))
default: default:
return nil, fmt.Errorf("invalid database type(uri_scheme): %s", ins.Scheme) return nil, fmt.Errorf("invalid database type(uri_scheme): %s", ins.Scheme)

View File

@ -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...)
}

View File

@ -1,115 +1,36 @@
package log package log
import ( import (
"github.com/fatih/color"
"io"
"sync" "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 ( var (
red = color.New(color.FgRed) Logger *zap.Logger
hired = color.New(color.FgHiRed) locker = &sync.Mutex{}
green = color.New(color.FgGreen)
yellow = color.New(color.FgYellow)
white = color.New(color.FgWhite)
) )
func (l *logger) SetTimeFormat(format string) { func init() {
l.Lock() var err error
defer l.Unlock() config := zap.NewProductionConfig()
l.timeFormat = format Logger, err = config.Build()
} if err != nil {
panic(err)
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 (l *logger) Debug(msg string, data ...any) { func Debug() {
l.debug(white.Sprint("Debug "), time.Now().Format(l.timeFormat), msg, data...) var err error
}
func (l *logger) Info(msg string, data ...any) { config := zap.NewProductionConfig()
l.info(green.Sprint("Info "), time.Now().Format(l.timeFormat), msg, data...) config.Level = zap.NewAtomicLevelAt(zap.DebugLevel)
}
func (l *logger) Warn(msg string, data ...any) { locker.Lock()
l.warn(yellow.Sprint("Warn "), time.Now().Format(l.timeFormat), msg, data...) defer locker.Unlock()
}
func (l *logger) Error(msg string, data ...any) { Logger, err = config.Build()
l.error(red.Sprint("Error "), time.Now().Format(l.timeFormat), msg, data...) if err != nil {
} panic(err)
}
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)
} }

View File

@ -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,
}
}

View File

@ -5,7 +5,7 @@ import "github.com/loveuer/uzone/pkg/log"
func Must(errs ...error) { func Must(errs ...error) {
for _, err := range errs { for _, err := range errs {
if err != nil { if err != nil {
log.Panic(err.Error()) log.Logger.Panic(err.Error())
} }
} }
} }

View File

@ -9,7 +9,6 @@ import (
"strconv" "strconv"
"strings" "strings"
"github.com/loveuer/uzone/pkg/log"
"golang.org/x/crypto/pbkdf2" "golang.org/x/crypto/pbkdf2"
) )
@ -21,26 +20,29 @@ func NewPassword(password string) string {
return EncryptPassword(password, RandomString(8), int(RandomInt(50000)+100000)) 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, "$") strs := strings.Split(db, "$")
if len(strs) != 3 { if len(strs) != 3 {
log.Error("password in db invalid: %s", db) return fmt.Errorf("password in db invalid: %s", db)
return false
} }
encs := strings.Split(strs[0], ":") encs := strings.Split(strs[0], ":")
if len(encs) != 3 { if len(encs) != 3 {
log.Error("password in db invalid: %s", db) return fmt.Errorf("password in db invalid: %s", db)
return false
} }
encIteration, err := strconv.Atoi(encs[2]) encIteration, err := strconv.Atoi(encs[2])
if err != nil { if err != nil {
log.Error("password in db invalid: %s, convert iter err: %s", db, err) return fmt.Errorf("password in db invalid: %s, convert iter err: %s", db, err)
return false
} }
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 { func EncryptPassword(password, salt string, iter int) string {
@ -66,7 +68,6 @@ func CheckPassword(password string) error {
for idx, pattern := range patternList { for idx, pattern := range patternList {
match, err = regexp.MatchString(pattern, password) match, err = regexp.MatchString(pattern, password)
if err != nil { if err != nil {
log.Warn("regex match string err, reg_str: %s, err: %v", pattern, err)
return errors.New("密码强度不够") return errors.New("密码强度不够")
} }

View File

@ -8,8 +8,9 @@ import (
"reflect" "reflect"
"strings" "strings"
"github.com/jedib0t/go-pretty/v6/table"
"github.com/loveuer/uzone/pkg/log" "github.com/loveuer/uzone/pkg/log"
"github.com/jedib0t/go-pretty/v6/table"
) )
func TablePrinter(data any, writers ...io.Writer) { func TablePrinter(data any, writers ...io.Writer) {
@ -81,8 +82,6 @@ Start:
p := fmt.Sprintf("%s.%s", prefix, rv.Type().Field(i).Name) p := fmt.Sprintf("%s.%s", prefix, rv.Type().Field(i).Name)
field := rv.Field(i) field := rv.Field(i)
// log.Debug("TablePrinter: prefix: %s, field: %v", p, rv.Field(i))
if !field.CanInterface() { if !field.CanInterface() {
return return
} }
@ -95,7 +94,7 @@ Start:
func TableMapPrinter(data []byte) { func TableMapPrinter(data []byte) {
m := make(map[string]any) m := make(map[string]any)
if err := json.Unmarshal(data, &m); err != nil { if err := json.Unmarshal(data, &m); err != nil {
log.Warn(err.Error()) log.Logger.Warn(err.Error())
return return
} }

View File

@ -65,7 +65,7 @@ func New(configs ...Config) *uzone {
} }
if config.Debug || property.Debug { if config.Debug || property.Debug {
log.SetLogLevel(log.LogLevelDebug) log.Debug()
app.debug = true app.debug = true
} }