diff --git a/logging/logging.go b/logging/logging.go index a9e1e3c..0e1ea25 100644 --- a/logging/logging.go +++ b/logging/logging.go @@ -18,45 +18,40 @@ import ( "bytes" "context" "fmt" - "log" "time" "github.com/gomodule/redigo/redis" ) var ( - _ redis.ConnWithTimeout = (*loggingConn)(nil) - logCallDepth = 3 + _ redis.ConnWithTimeout = (*loggingConn)(nil) ) -// NewLoggingConn returns a logging wrapper around a connection. -func NewLoggingConn(conn redis.Conn, logger *log.Logger, prefix string) redis.Conn { - if prefix != "" { - 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 Logger interface { + Debugf(format string, v ...interface{}) + Errorf(format string, v ...interface{}) } type loggingConn struct { redis.Conn - logger *log.Logger - prefix string - skip func(cmdName string) bool + logger Logger + prefix string + 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 { err := c.Conn.Close() - var buf bytes.Buffer - fmt.Fprintf(&buf, "%sClose() -> (%v)", c.prefix, err) - c.logger.Output(logCallDepth, buf.String()) // nolint: errcheck + c.logger.Debugf("%sClose() -> (%v)", c.prefix, 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) { - if c.skip != nil && c.skip(commandName) { + if c.logskip != nil && c.logskip(commandName) { return } var buf bytes.Buffer @@ -111,12 +106,15 @@ func (c *loggingConn) print(method, commandName string, args []interface{}, repl } } buf.WriteString(") -> (") - if method != "Send" { - c.printValue(&buf, reply) - buf.WriteString(", ") + if err != nil { + fmt.Fprintf(&buf, "error: %v)", err) + } else { + if method != "Send" { + c.printValue(&buf, reply) + } + buf.WriteString(")") } - fmt.Fprintf(&buf, "%v)", err) - 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) { diff --git a/redis/redis.go b/redis/redis.go index d6c7bc8..986b5ee 100644 --- a/redis/redis.go +++ b/redis/redis.go @@ -2,10 +2,10 @@ package redis import ( "fmt" - "log" - "os" "time" + "qoobing.com/gomod/log" + "github.com/gomodule/redigo/redis" "qoobing.com/gomod/redis/logging" "qoobing.com/gomod/redis/sentinel" @@ -51,15 +51,8 @@ func NewPool(cfg Config) *redis.Pool { } var ( - logPrefix = "redis" - logStdPrefix = "DBUG " - 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) + logPrefix = "redis " + logLogger = log.New("redis") ) return &redis.Pool{ MaxIdle: *cfg.MaxIdle, @@ -69,7 +62,7 @@ func NewPool(cfg Config) *redis.Pool { Dial: func() (redis.Conn, error) { c, err := redis.Dial("tcp", masterAddr) 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 } @@ -81,23 +74,15 @@ func NewPool(cfg Config) *redis.Pool { } 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()) } 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) } - //// 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 { - c = logging.NewLoggingConn(c, logStdLogger, logPrefix) + c = logging.NewLoggingConn(c, logLogger, logPrefix) } return c, nil }, diff --git a/sentinel/sentinel.go b/sentinel/sentinel.go index a0bd543..410d75c 100644 --- a/sentinel/sentinel.go +++ b/sentinel/sentinel.go @@ -3,14 +3,13 @@ package sentinel import ( "errors" "fmt" - "log" "net" - "os" "strings" "sync" "time" "github.com/gomodule/redigo/redis" + "qoobing.com/gomod/log" "qoobing.com/gomod/redis/logging" ) @@ -123,17 +122,9 @@ func NewPool(cfg Config) *redis.Pool { } else if *cfg.MaxActive < 0 { *cfg.MaxActive = 100 } - var ( - logPrefix = "redis" - logStdPrefix = "DBUG " - 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) + logPrefix = "redis " + logLogger = log.New("redis") ) return &redis.Pool{ MaxIdle: *cfg.MaxIdle, @@ -143,13 +134,13 @@ func NewPool(cfg Config) *redis.Pool { Dial: func() (redis.Conn, error) { masterAddr, err := sntnl.MasterAddr() 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 } c, err := redis.Dial("tcp", masterAddr) 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 } @@ -161,10 +152,10 @@ func NewPool(cfg Config) *redis.Pool { } 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()) } 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) } @@ -173,12 +164,12 @@ func NewPool(cfg Config) *redis.Pool { err = fmt.Errorf( "master(%s) got by name '%s' is not redis master", masterAddr, masterName) - logErrLogger.Output(2, err.Error()) + logLogger.Errorf("%s", err.Error()) return nil, err } if cfg.Debug { - c = logging.NewLoggingConn(c, logStdLogger, logPrefix) + c = logging.NewLoggingConn(c, logLogger, logPrefix) } return c, nil },