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/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

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.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=

53
log.go
View File

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

View File

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

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
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...)
Logger, err = config.Build()
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) {
for _, err := range errs {
if err != nil {
log.Panic(err.Error())
log.Logger.Panic(err.Error())
}
}
}

View File

@ -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("密码强度不够")
}

View File

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

View File

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