feat: use qoobing log

This commit is contained in:
bryan 2025-06-15 09:08:40 +08:00
parent eef1014397
commit ddf1439876
3 changed files with 44 additions and 70 deletions

View File

@ -18,7 +18,6 @@ import (
"bytes" "bytes"
"context" "context"
"fmt" "fmt"
"log"
"time" "time"
"github.com/gomodule/redigo/redis" "github.com/gomodule/redigo/redis"
@ -26,37 +25,33 @@ import (
var ( var (
_ redis.ConnWithTimeout = (*loggingConn)(nil) _ redis.ConnWithTimeout = (*loggingConn)(nil)
logCallDepth = 3
) )
// NewLoggingConn returns a logging wrapper around a connection. type Logger interface {
func NewLoggingConn(conn redis.Conn, logger *log.Logger, prefix string) redis.Conn { Debugf(format string, v ...interface{})
if prefix != "" { Errorf(format string, v ...interface{})
prefix = prefix + "."
}
return &loggingConn{conn, logger, prefix, nil}
}
// NewLoggingConnFilter returns a logging wrapper around a connection and a filter function.
func NewLoggingConnFilter(conn redis.Conn, logger *log.Logger, prefix string, skip func(cmdName string) bool) redis.Conn {
if prefix != "" {
prefix = prefix + "."
}
return &loggingConn{conn, logger, prefix, skip}
} }
type loggingConn struct { type loggingConn struct {
redis.Conn redis.Conn
logger *log.Logger logger Logger
prefix string prefix string
skip func(cmdName string) bool logskip func(cmdName string) bool
}
// NewLoggingConn returns a logging wrapper around a connection.
func NewLoggingConn(conn redis.Conn, logger Logger, prefix string) redis.Conn {
return &loggingConn{conn, logger, prefix, nil}
}
// NewLoggingConnFilter returns a logging wrapper around a connection and a filter function.
func NewLoggingConnFilter(conn redis.Conn, logger Logger, prefix string, skip func(cmdName string) bool) redis.Conn {
return &loggingConn{conn, logger, prefix, skip}
} }
func (c *loggingConn) Close() error { func (c *loggingConn) Close() error {
err := c.Conn.Close() err := c.Conn.Close()
var buf bytes.Buffer c.logger.Debugf("%sClose() -> (%v)", c.prefix, err)
fmt.Fprintf(&buf, "%sClose() -> (%v)", c.prefix, err)
c.logger.Output(logCallDepth, buf.String()) // nolint: errcheck
return err return err
} }
@ -98,7 +93,7 @@ func (c *loggingConn) printValue(buf *bytes.Buffer, v interface{}) {
} }
func (c *loggingConn) print(method, commandName string, args []interface{}, reply interface{}, err error) { func (c *loggingConn) print(method, commandName string, args []interface{}, reply interface{}, err error) {
if c.skip != nil && c.skip(commandName) { if c.logskip != nil && c.logskip(commandName) {
return return
} }
var buf bytes.Buffer var buf bytes.Buffer
@ -111,12 +106,15 @@ func (c *loggingConn) print(method, commandName string, args []interface{}, repl
} }
} }
buf.WriteString(") -> (") buf.WriteString(") -> (")
if err != nil {
fmt.Fprintf(&buf, "error: %v)", err)
} else {
if method != "Send" { if method != "Send" {
c.printValue(&buf, reply) c.printValue(&buf, reply)
buf.WriteString(", ")
} }
fmt.Fprintf(&buf, "%v)", err) buf.WriteString(")")
c.logger.Output(logCallDepth+1, buf.String()) // nolint: errcheck }
c.logger.Debugf("%s", buf.String())
} }
func (c *loggingConn) Do(commandName string, args ...interface{}) (interface{}, error) { func (c *loggingConn) Do(commandName string, args ...interface{}) (interface{}, error) {

View File

@ -2,10 +2,10 @@ package redis
import ( import (
"fmt" "fmt"
"log"
"os"
"time" "time"
"qoobing.com/gomod/log"
"github.com/gomodule/redigo/redis" "github.com/gomodule/redigo/redis"
"qoobing.com/gomod/redis/logging" "qoobing.com/gomod/redis/logging"
"qoobing.com/gomod/redis/sentinel" "qoobing.com/gomod/redis/sentinel"
@ -52,14 +52,7 @@ func NewPool(cfg Config) *redis.Pool {
var ( var (
logPrefix = "redis " logPrefix = "redis "
logStdPrefix = "DBUG " logLogger = log.New("redis")
logStdWriter = os.Stdout
logStdFlags = log.Ldate | log.Lmicroseconds | log.Lshortfile
logStdLogger = log.New(logStdWriter, logStdPrefix, logStdFlags)
logErrPrefix = "ERRO "
logErrWriter = os.Stderr
logErrFlags = log.Ldate | log.Lmicroseconds | log.Lshortfile
logErrLogger = log.New(logErrWriter, logErrPrefix, logErrFlags)
) )
return &redis.Pool{ return &redis.Pool{
MaxIdle: *cfg.MaxIdle, MaxIdle: *cfg.MaxIdle,
@ -69,7 +62,7 @@ func NewPool(cfg Config) *redis.Pool {
Dial: func() (redis.Conn, error) { Dial: func() (redis.Conn, error) {
c, err := redis.Dial("tcp", masterAddr) c, err := redis.Dial("tcp", masterAddr)
if err != nil { if err != nil {
logErrLogger.Output(2, fmt.Sprintf("connect [%s] error: %s", masterAddr, err)) logLogger.Errorf("connect [%s] error: %s", masterAddr, err)
return nil, err return nil, err
} }
@ -81,23 +74,15 @@ func NewPool(cfg Config) *redis.Pool {
} }
if err != nil { if err != nil {
logErrLogger.Output(2, fmt.Sprintf("auth [%s] error: %s", masterAddr, err)) logLogger.Errorf("auth [%s] error: %s", masterAddr, err)
return nil, fmt.Errorf("redis master AUTH failed: <%s>", err.Error()) return nil, fmt.Errorf("redis master AUTH failed: <%s>", err.Error())
} else if okstr != "OK" { } else if okstr != "OK" {
logErrLogger.Output(2, fmt.Sprintf("auth [%s] not return ok but '%s'", masterAddr, okstr)) logLogger.Errorf("auth [%s] not return ok but '%s'", masterAddr, okstr)
return nil, fmt.Errorf("redis master AUTH failed: <%s>", okstr) return nil, fmt.Errorf("redis master AUTH failed: <%s>", okstr)
} }
//// if !TestRole(c, "master") {
//// c.Close()
//// err = fmt.Errorf(
//// "master(%s) got by name '%s' is not redis master",
//// masterAddr, masterName)
//// return nil, err
//// }
if cfg.Debug { if cfg.Debug {
c = logging.NewLoggingConn(c, logStdLogger, logPrefix) c = logging.NewLoggingConn(c, logLogger, logPrefix)
} }
return c, nil return c, nil
}, },

View File

@ -3,14 +3,13 @@ package sentinel
import ( import (
"errors" "errors"
"fmt" "fmt"
"log"
"net" "net"
"os"
"strings" "strings"
"sync" "sync"
"time" "time"
"github.com/gomodule/redigo/redis" "github.com/gomodule/redigo/redis"
"qoobing.com/gomod/log"
"qoobing.com/gomod/redis/logging" "qoobing.com/gomod/redis/logging"
) )
@ -123,17 +122,9 @@ func NewPool(cfg Config) *redis.Pool {
} else if *cfg.MaxActive < 0 { } else if *cfg.MaxActive < 0 {
*cfg.MaxActive = 100 *cfg.MaxActive = 100
} }
var ( var (
logPrefix = "redis " logPrefix = "redis "
logStdPrefix = "DBUG " logLogger = log.New("redis")
logStdWriter = os.Stdout
logStdFlags = log.Ldate | log.Lmicroseconds | log.Lshortfile
logStdLogger = log.New(logStdWriter, logStdPrefix, logStdFlags)
logErrPrefix = "ERRO "
logErrWriter = os.Stderr
logErrFlags = log.Ldate | log.Lmicroseconds | log.Lshortfile
logErrLogger = log.New(logErrWriter, logErrPrefix, logErrFlags)
) )
return &redis.Pool{ return &redis.Pool{
MaxIdle: *cfg.MaxIdle, MaxIdle: *cfg.MaxIdle,
@ -143,13 +134,13 @@ func NewPool(cfg Config) *redis.Pool {
Dial: func() (redis.Conn, error) { Dial: func() (redis.Conn, error) {
masterAddr, err := sntnl.MasterAddr() masterAddr, err := sntnl.MasterAddr()
if err != nil { if err != nil {
logErrLogger.Output(2, fmt.Sprintf("get master from sentinel error: %s", err)) logLogger.Errorf("get master from sentinel error: %s", err)
return nil, err return nil, err
} }
c, err := redis.Dial("tcp", masterAddr) c, err := redis.Dial("tcp", masterAddr)
if err != nil { if err != nil {
logErrLogger.Output(2, fmt.Sprintf("connect [%s] error: %s", masterAddr, err)) logLogger.Errorf("connect [%s] error: %s", masterAddr, err)
return nil, err return nil, err
} }
@ -161,10 +152,10 @@ func NewPool(cfg Config) *redis.Pool {
} }
if err != nil { if err != nil {
logErrLogger.Output(2, fmt.Sprintf("auth [%s] error: %s", masterAddr, err)) logLogger.Errorf("auth [%s] error: %s", masterAddr, err)
return nil, fmt.Errorf("redis master AUTH failed: <%s>", err.Error()) return nil, fmt.Errorf("redis master AUTH failed: <%s>", err.Error())
} else if okstr != "OK" { } else if okstr != "OK" {
logErrLogger.Output(2, fmt.Sprintf("auth [%s] not return ok but '%s'", masterAddr, okstr)) logLogger.Errorf("auth [%s] not return ok but '%s'", masterAddr, okstr)
return nil, fmt.Errorf("redis master AUTH failed: <%s>", okstr) return nil, fmt.Errorf("redis master AUTH failed: <%s>", okstr)
} }
@ -173,12 +164,12 @@ func NewPool(cfg Config) *redis.Pool {
err = fmt.Errorf( err = fmt.Errorf(
"master(%s) got by name '%s' is not redis master", "master(%s) got by name '%s' is not redis master",
masterAddr, masterName) masterAddr, masterName)
logErrLogger.Output(2, err.Error()) logLogger.Errorf("%s", err.Error())
return nil, err return nil, err
} }
if cfg.Debug { if cfg.Debug {
c = logging.NewLoggingConn(c, logStdLogger, logPrefix) c = logging.NewLoggingConn(c, logLogger, logPrefix)
} }
return c, nil return c, nil
}, },