Declare and use a package-level Logger

This allow users of the API to override the Logger. Fix #250.
This commit is contained in:
Francisco Souza 2016-02-03 12:30:39 -05:00
parent 538069c33f
commit d3ee281748
8 changed files with 30 additions and 34 deletions

View File

@ -1,7 +1,6 @@
package redis package redis
import ( import (
"log"
"math/rand" "math/rand"
"sync" "sync"
"sync/atomic" "sync/atomic"
@ -256,13 +255,13 @@ func (c *ClusterClient) reloadSlots() {
client, err := c.randomClient() client, err := c.randomClient()
if err != nil { if err != nil {
log.Printf("redis: randomClient failed: %s", err) Logger.Printf("redis: randomClient failed: %s", err)
return return
} }
slots, err := client.ClusterSlots().Result() slots, err := client.ClusterSlots().Result()
if err != nil { if err != nil {
log.Printf("redis: ClusterSlots failed: %s", err) Logger.Printf("redis: ClusterSlots failed: %s", err)
return return
} }
c.setSlots(slots) c.setSlots(slots)

View File

@ -2,7 +2,6 @@ package redis
import ( import (
"io" "io"
"log"
"strconv" "strconv"
"time" "time"
) )
@ -32,7 +31,7 @@ func usePrecise(dur time.Duration) bool {
func formatMs(dur time.Duration) string { func formatMs(dur time.Duration) string {
if dur > 0 && dur < time.Millisecond { if dur > 0 && dur < time.Millisecond {
log.Printf( Logger.Printf(
"redis: specified duration is %s, but minimal supported value is %s", "redis: specified duration is %s, but minimal supported value is %s",
dur, time.Millisecond, dur, time.Millisecond,
) )
@ -42,7 +41,7 @@ func formatMs(dur time.Duration) string {
func formatSec(dur time.Duration) string { func formatSec(dur time.Duration) string {
if dur > 0 && dur < time.Second { if dur > 0 && dur < time.Second {
log.Printf( Logger.Printf(
"redis: specified duration is %s, but minimal supported value is %s", "redis: specified duration is %s, but minimal supported value is %s",
dur, time.Second, dur, time.Second,
) )

View File

@ -3,7 +3,6 @@ package redis
import ( import (
"errors" "errors"
"fmt" "fmt"
"log"
) )
var errDiscard = errors.New("redis: Discard can be used only inside Exec") var errDiscard = errors.New("redis: Discard can be used only inside Exec")
@ -53,7 +52,7 @@ func (c *Multi) putConn(cn *conn, err error) {
} else { } else {
err := c.base.connPool.Put(cn) err := c.base.connPool.Put(cn)
if err != nil { if err != nil {
log.Printf("redis: putConn failed: %s", err) Logger.Printf("redis: putConn failed: %s", err)
} }
} }
} }
@ -70,7 +69,7 @@ func (c *Multi) process(cmd Cmder) {
func (c *Multi) Close() error { func (c *Multi) Close() error {
c.closed = true c.closed = true
if err := c.Unwatch().Err(); err != nil { if err := c.Unwatch().Err(); err != nil {
log.Printf("redis: Unwatch failed: %s", err) Logger.Printf("redis: Unwatch failed: %s", err)
} }
return c.base.Close() return c.base.Close()
} }

View File

@ -3,7 +3,6 @@ package redis
import ( import (
"errors" "errors"
"fmt" "fmt"
"log"
"sync" "sync"
"sync/atomic" "sync/atomic"
"time" "time"
@ -178,7 +177,7 @@ func (p *connPool) First() *conn {
var err error var err error
cn, err = p.replace(cn) cn, err = p.replace(cn)
if err != nil { if err != nil {
log.Printf("redis: replace failed: %s", err) Logger.Printf("redis: replace failed: %s", err)
continue continue
} }
} }
@ -200,7 +199,7 @@ func (p *connPool) wait() *conn {
var err error var err error
cn, err = p.replace(cn) cn, err = p.replace(cn)
if err != nil { if err != nil {
log.Printf("redis: replace failed: %s", err) Logger.Printf("redis: replace failed: %s", err)
continue continue
} }
} }
@ -272,7 +271,7 @@ func (p *connPool) Put(cn *conn) error {
if cn.rd.Buffered() != 0 { if cn.rd.Buffered() != 0 {
b, _ := cn.rd.Peek(cn.rd.Buffered()) b, _ := cn.rd.Peek(cn.rd.Buffered())
err := fmt.Errorf("redis: connection has unread data: %q", b) err := fmt.Errorf("redis: connection has unread data: %q", b)
log.Print(err) Logger.Print(err)
return p.Remove(cn, err) return p.Remove(cn, err)
} }
if p.opt.getIdleTimeout() > 0 { if p.opt.getIdleTimeout() > 0 {

View File

@ -2,7 +2,6 @@ package redis
import ( import (
"fmt" "fmt"
"log"
"net" "net"
"time" "time"
) )
@ -239,12 +238,12 @@ func (c *PubSub) reconnect(reason error) {
if len(c.channels) > 0 { if len(c.channels) > 0 {
if err := c.Subscribe(c.channels...); err != nil { if err := c.Subscribe(c.channels...); err != nil {
log.Printf("redis: Subscribe failed: %s", err) Logger.Printf("redis: Subscribe failed: %s", err)
} }
} }
if len(c.patterns) > 0 { if len(c.patterns) > 0 {
if err := c.PSubscribe(c.patterns...); err != nil { if err := c.PSubscribe(c.patterns...); err != nil {
log.Printf("redis: PSubscribe failed: %s", err) Logger.Printf("redis: PSubscribe failed: %s", err)
} }
} }
} }
@ -269,7 +268,7 @@ func (c *PubSub) ReceiveMessage() (*Message, error) {
if err == nil { if err == nil {
continue continue
} }
log.Printf("redis: PubSub.Ping failed: %s", err) Logger.Printf("redis: PubSub.Ping failed: %s", err)
} }
} }

View File

@ -4,9 +4,12 @@ import (
"fmt" "fmt"
"log" "log"
"net" "net"
"os"
"time" "time"
) )
var Logger = log.New(os.Stderr, "", log.LstdFlags)
type baseClient struct { type baseClient struct {
connPool pool connPool pool
opt *Options opt *Options
@ -27,7 +30,7 @@ func (c *baseClient) putConn(cn *conn, err error) {
err = c.connPool.Put(cn) err = c.connPool.Put(cn)
} }
if err != nil { if err != nil {
log.Printf("redis: putConn failed: %s", err) Logger.Printf("redis: putConn failed: %s", err)
} }
} }

View File

@ -3,7 +3,6 @@ package redis
import ( import (
"errors" "errors"
"fmt" "fmt"
"log"
"sync" "sync"
"time" "time"
@ -202,7 +201,7 @@ func (ring *Ring) heartbeat() {
for _, shard := range ring.shards { for _, shard := range ring.shards {
err := shard.Client.Ping().Err() err := shard.Client.Ping().Err()
if shard.Vote(err == nil || err == errPoolTimeout) { if shard.Vote(err == nil || err == errPoolTimeout) {
log.Printf("redis: ring shard state changed: %s", shard) Logger.Printf("redis: ring shard state changed: %s", shard)
rebalance = true rebalance = true
} }
} }

View File

@ -3,7 +3,6 @@ package redis
import ( import (
"errors" "errors"
"fmt" "fmt"
"log"
"net" "net"
"strings" "strings"
"sync" "sync"
@ -145,11 +144,11 @@ func (d *sentinelFailover) MasterAddr() (string, error) {
if d._sentinel != nil { if d._sentinel != nil {
addr, err := d._sentinel.GetMasterAddrByName(d.masterName).Result() addr, err := d._sentinel.GetMasterAddrByName(d.masterName).Result()
if err != nil { if err != nil {
log.Printf("redis-sentinel: GetMasterAddrByName %q failed: %s", d.masterName, err) Logger.Printf("redis-sentinel: GetMasterAddrByName %q failed: %s", d.masterName, err)
d.resetSentinel() d.resetSentinel()
} else { } else {
addr := net.JoinHostPort(addr[0], addr[1]) addr := net.JoinHostPort(addr[0], addr[1])
log.Printf("redis-sentinel: %q addr is %s", d.masterName, addr) Logger.Printf("redis-sentinel: %q addr is %s", d.masterName, addr)
return addr, nil return addr, nil
} }
} }
@ -168,7 +167,7 @@ func (d *sentinelFailover) MasterAddr() (string, error) {
}) })
masterAddr, err := sentinel.GetMasterAddrByName(d.masterName).Result() masterAddr, err := sentinel.GetMasterAddrByName(d.masterName).Result()
if err != nil { if err != nil {
log.Printf("redis-sentinel: GetMasterAddrByName %q failed: %s", d.masterName, err) Logger.Printf("redis-sentinel: GetMasterAddrByName %q failed: %s", d.masterName, err)
sentinel.Close() sentinel.Close()
continue continue
} }
@ -178,7 +177,7 @@ func (d *sentinelFailover) MasterAddr() (string, error) {
d.setSentinel(sentinel) d.setSentinel(sentinel)
addr := net.JoinHostPort(masterAddr[0], masterAddr[1]) addr := net.JoinHostPort(masterAddr[0], masterAddr[1])
log.Printf("redis-sentinel: %q addr is %s", d.masterName, addr) Logger.Printf("redis-sentinel: %q addr is %s", d.masterName, addr)
return addr, nil return addr, nil
} }
@ -194,7 +193,7 @@ func (d *sentinelFailover) setSentinel(sentinel *sentinelClient) {
func (d *sentinelFailover) discoverSentinels(sentinel *sentinelClient) { func (d *sentinelFailover) discoverSentinels(sentinel *sentinelClient) {
sentinels, err := sentinel.Sentinels(d.masterName).Result() sentinels, err := sentinel.Sentinels(d.masterName).Result()
if err != nil { if err != nil {
log.Printf("redis-sentinel: Sentinels %q failed: %s", d.masterName, err) Logger.Printf("redis-sentinel: Sentinels %q failed: %s", d.masterName, err)
return return
} }
for _, sentinel := range sentinels { for _, sentinel := range sentinels {
@ -204,7 +203,7 @@ func (d *sentinelFailover) discoverSentinels(sentinel *sentinelClient) {
if key == "name" { if key == "name" {
sentinelAddr := vals[i+1].(string) sentinelAddr := vals[i+1].(string)
if !contains(d.sentinelAddrs, sentinelAddr) { if !contains(d.sentinelAddrs, sentinelAddr) {
log.Printf( Logger.Printf(
"redis-sentinel: discovered new %q sentinel: %s", "redis-sentinel: discovered new %q sentinel: %s",
d.masterName, sentinelAddr, d.masterName, sentinelAddr,
) )
@ -232,7 +231,7 @@ func (d *sentinelFailover) closeOldConns(newMaster string) {
"redis-sentinel: closing connection to the old master %s", "redis-sentinel: closing connection to the old master %s",
cn.RemoteAddr(), cn.RemoteAddr(),
) )
log.Print(err) Logger.Print(err)
d.pool.Remove(cn, err) d.pool.Remove(cn, err)
} else { } else {
cnsToPut = append(cnsToPut, cn) cnsToPut = append(cnsToPut, cn)
@ -250,7 +249,7 @@ func (d *sentinelFailover) listen() {
if pubsub == nil { if pubsub == nil {
pubsub = d._sentinel.PubSub() pubsub = d._sentinel.PubSub()
if err := pubsub.Subscribe("+switch-master"); err != nil { if err := pubsub.Subscribe("+switch-master"); err != nil {
log.Printf("redis-sentinel: Subscribe failed: %s", err) Logger.Printf("redis-sentinel: Subscribe failed: %s", err)
d.lock.Lock() d.lock.Lock()
d.resetSentinel() d.resetSentinel()
d.lock.Unlock() d.lock.Unlock()
@ -260,7 +259,7 @@ func (d *sentinelFailover) listen() {
msgIface, err := pubsub.Receive() msgIface, err := pubsub.Receive()
if err != nil { if err != nil {
log.Printf("redis-sentinel: Receive failed: %s", err) Logger.Printf("redis-sentinel: Receive failed: %s", err)
pubsub.Close() pubsub.Close()
return return
} }
@ -271,23 +270,23 @@ func (d *sentinelFailover) listen() {
case "+switch-master": case "+switch-master":
parts := strings.Split(msg.Payload, " ") parts := strings.Split(msg.Payload, " ")
if parts[0] != d.masterName { if parts[0] != d.masterName {
log.Printf("redis-sentinel: ignore new %s addr", parts[0]) Logger.Printf("redis-sentinel: ignore new %s addr", parts[0])
continue continue
} }
addr := net.JoinHostPort(parts[3], parts[4]) addr := net.JoinHostPort(parts[3], parts[4])
log.Printf( Logger.Printf(
"redis-sentinel: new %q addr is %s", "redis-sentinel: new %q addr is %s",
d.masterName, addr, d.masterName, addr,
) )
d.closeOldConns(addr) d.closeOldConns(addr)
default: default:
log.Printf("redis-sentinel: unsupported message: %s", msg) Logger.Printf("redis-sentinel: unsupported message: %s", msg)
} }
case *Subscription: case *Subscription:
// Ignore. // Ignore.
default: default:
log.Printf("redis-sentinel: unsupported message: %s", msgIface) Logger.Printf("redis-sentinel: unsupported message: %s", msgIface)
} }
} }
} }