wip: refactory log with zap
This commit is contained in:
parent
0cf05cdf30
commit
1ea5507e5f
2
go.mod
2
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
|
||||
|
5
go.sum
5
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=
|
||||
|
53
log.go
53
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
|
||||
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()
|
||||
}
|
||||
|
@ -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)
|
||||
|
@ -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...)
|
||||
}
|
119
pkg/log/log.go
119
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)
|
||||
}
|
||||
}
|
||||
|
@ -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,
|
||||
}
|
||||
}
|
@ -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())
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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("密码强度不够")
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user